Changeset - r28823:ebda70ff18b6
[Not reviewed]
master
0 2 0
Peter Nelson - 9 months ago 2024-02-25 21:33:11
peter1138@openttd.org
Codefix: DrawEngineList does not accept EngineID.

Replace min/max parameters of DrawEngineList with scrollbar reference, and use iterators instead of indices.
2 files changed with 12 insertions and 17 deletions:
0 comments (0 inline, 0 general)
src/autoreplace_gui.cpp
Show inline comments
 
@@ -30,13 +30,13 @@
 
#include "settings_cmd.h"
 

	
 
#include "widgets/autoreplace_widget.h"
 

	
 
#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)
 
{
 
	return Engine::Get(a.engine_id)->list_position < Engine::Get(b.engine_id)->list_position;
 
}
 

	
 
@@ -484,17 +484,15 @@ public:
 
				break;
 
			}
 

	
 
			case WID_RV_LEFT_MATRIX:
 
			case WID_RV_RIGHT_MATRIX: {
 
				int side = (widget == WID_RV_LEFT_MATRIX) ? 0 : 1;
 
				EngineID start  = static_cast<EngineID>(this->vscroll[side]->GetPosition()); // what is the offset for the start (scrolling)
 
				EngineID end    = static_cast<EngineID>(std::min<size_t>(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;
 
			}
 
		}
 
	}
 

	
 
	void OnPaint() override
src/build_vehicle_gui.cpp
Show inline comments
 
@@ -995,24 +995,22 @@ int DrawVehiclePurchaseInfo(int left, in
 

	
 
/**
 
 * Engine drawing loop
 
 * @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);
 
	int sprite_left  = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_left;
 
	int sprite_right = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_right;
 
	int sprite_width = sprite_left + sprite_right;
 
@@ -1025,15 +1023,14 @@ void DrawEngineList(VehicleType type, co
 
	Dimension replace_icon = {0, 0};
 
	int count_width = 0;
 
	if (show_count) {
 
		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);
 
		}
 

	
 
		SetDParam(0, biggest_num_engines);
 
		count_width = GetStringBoundingBox(STR_JUST_COMMA, FS_SMALL).width;
 
	}
 
@@ -1045,14 +1042,14 @@ void DrawEngineList(VehicleType type, co
 

	
 
	int normal_text_y_offset = (ir.Height() - GetCharacterHeight(FS_NORMAL)) / 2;
 
	int small_text_y_offset  = ir.Height() - GetCharacterHeight(FS_SMALL);
 
	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;
 
		bool shaded       = (item.flags & EngineDisplayFlags::Shaded)      != EngineDisplayFlags::None;
 
		/* Note: num_engines is only used in the autoreplace GUI, so it is correct to use _local_company here. */
 
		const uint num_engines = GetGroupNumEngines(_local_company, selected_group, item.engine_id);
 
@@ -1082,16 +1079,17 @@ void DrawEngineList(VehicleType type, co
 
			DrawSpriteIgnorePadding(is_folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, {fr.left, y, fr.right, y + ir.Height() - 1}, SA_CENTER);
 
		}
 
		if (indent > 0) {
 
			/* 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;
 
	}
 
}
 

	
 
/**
 
 * Display the dropdown for the vehicle sort criteria.
 
 * @param w Parent window (holds the dropdown button).
 
@@ -1788,14 +1786,13 @@ struct BuildVehicleWindow : Window {
 
		switch (widget) {
 
			case WID_BV_LIST:
 
				DrawEngineList(
 
					this->vehicle_type,
 
					r,
 
					this->eng_list,
 
					this->vscroll->GetPosition(),
 
					static_cast<uint16_t>(std::min<size_t>(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->eng_list.size())),
 
					*this->vscroll,
 
					this->sel_engine,
 
					false,
 
					DEFAULT_GROUP
 
				);
 
				break;
 

	
0 comments (0 inline, 0 general)