From a61311fcb0d2e340d1a6ebfb1bb1545120a182e9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Sun, 25 Feb 2024 21:33:11 +0000 Subject: [PATCH] Codefix: DrawEngineList does not accept EngineID. Replace min/max parameters of DrawEngineList with scrollbar reference, and use iterators instead of indices. --- src/autoreplace_gui.cpp | 6 ++---- src/build_vehicle_gui.cpp | 23 ++++++++++------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index 64707259d3..5072dbb4ae 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -33,7 +33,7 @@ #include "safeguards.h" -void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, uint16_t min, uint16_t max, EngineID selected_id, bool show_count, GroupID selected_group); +void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, const Scrollbar &sb, EngineID selected_id, bool show_count, GroupID selected_group); static bool EngineNumberSorter(const GUIEngineListItem &a, const GUIEngineListItem &b) { @@ -487,11 +487,9 @@ public: case WID_RV_LEFT_MATRIX: case WID_RV_RIGHT_MATRIX: { int side = (widget == WID_RV_LEFT_MATRIX) ? 0 : 1; - EngineID start = static_cast(this->vscroll[side]->GetPosition()); // what is the offset for the start (scrolling) - EngineID end = static_cast(std::min(this->vscroll[side]->GetCapacity() + start, this->engines[side].size())); /* Do the actual drawing */ - DrawEngineList((VehicleType)this->window_number, r, this->engines[side], start, end, this->sel_engine[side], side == 0, this->sel_group); + DrawEngineList((VehicleType)this->window_number, r, this->engines[side], *this->vscroll[side], this->sel_engine[side], side == 0, this->sel_group); break; } } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index f4729fe920..11211a2ae9 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -998,18 +998,16 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number, * @param type Type of vehicle (VEH_*) * @param r The Rect of the list * @param eng_list What engines to draw - * @param min where to start in the list - * @param max where in the list to end + * @param sb Scrollbar of list. * @param selected_id what engine to highlight as selected, if any * @param show_count Whether to show the amount of engines or not * @param selected_group the group to list the engines of */ -void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, uint16_t min, uint16_t max, EngineID selected_id, bool show_count, GroupID selected_group) +void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_list, const Scrollbar &sb, EngineID selected_id, bool show_count, GroupID selected_group) { static const int sprite_y_offsets[] = { -1, -1, -2, -2 }; - /* Obligatory sanity checks! */ - assert(max <= eng_list.size()); + auto [first, last] = sb.GetVisibleRangeIterators(eng_list); bool rtl = _current_text_dir == TD_RTL; int step_size = GetEngineListHeight(type); @@ -1028,9 +1026,8 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li replace_icon = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE); uint biggest_num_engines = 0; - for (auto i = min; i < max; i++) { - const auto &item = eng_list[i]; - const uint num_engines = GetGroupNumEngines(_local_company, selected_group, item.engine_id); + for (auto it = first; it != last; ++it) { + const uint num_engines = GetGroupNumEngines(_local_company, selected_group, it->engine_id); biggest_num_engines = std::max(biggest_num_engines, num_engines); } @@ -1048,8 +1045,8 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li int replace_icon_y_offset = (ir.Height() - replace_icon.height) / 2; int y = ir.top; - for (; min < max; min++, y += step_size) { - const auto &item = eng_list[min]; + for (auto it = first; it != last; ++it) { + const auto &item = *it; uint indent = item.indent * WidgetDimensions::scaled.hsep_indent; bool has_variants = (item.flags & EngineDisplayFlags::HasVariants) != EngineDisplayFlags::None; bool is_folded = (item.flags & EngineDisplayFlags::IsFolded) != EngineDisplayFlags::None; @@ -1085,10 +1082,11 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li /* Draw tree lines */ Rect fr = ir.Indent(indent - WidgetDimensions::scaled.hsep_indent, rtl).WithWidth(circle_width, rtl); int ycenter = y + normal_text_y_offset + GetCharacterHeight(FS_NORMAL) / 2; - bool continues = (min + 1U) < eng_list.size() && eng_list[min + 1].indent == item.indent; + bool continues = std::next(it) != std::end(eng_list) && std::next(it)->indent == item.indent; GfxDrawLine(fr.left + circle_width / 2, y - WidgetDimensions::scaled.matrix.top, fr.left + circle_width / 2, continues ? y - WidgetDimensions::scaled.matrix.top + step_size - 1 : ycenter, linecolour, WidgetDimensions::scaled.fullbevel.top); GfxDrawLine(fr.left + circle_width / 2, ycenter, fr.right, ycenter, linecolour, WidgetDimensions::scaled.fullbevel.top); } + y += step_size; } } @@ -1791,8 +1789,7 @@ struct BuildVehicleWindow : Window { this->vehicle_type, r, this->eng_list, - this->vscroll->GetPosition(), - static_cast(std::min(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->eng_list.size())), + *this->vscroll, this->sel_engine, false, DEFAULT_GROUP