20 #include "table/strings.h"
33 if (result.
Failed())
return;
40 if (found != NULL)
return;
47 found = found->
Last();
68 for (
Train *t =
Train::Get(selection); t != NULL; t = chain ? t->
Next() : (t->HasArticulatedPart() ? t->GetNextArticulatedPart() : NULL)) {
69 dragged_width += t->GetDisplayImageWidth(NULL);
72 int drag_hlight_left = rtl ?
max(px -dragged_width, 0) : px;
73 int drag_hlight_right = rtl ? px :
min(px + dragged_width, max_width);
74 int drag_hlight_width =
max(drag_hlight_right - drag_hlight_left, 0);
76 if (drag_hlight_width > 0) {
81 return drag_hlight_width;
103 int max_width = right - left + 1;
111 int px = rtl ? max_width + skip : -skip;
112 bool sel_articulated =
false;
114 bool drag_at_end_of_train = (drag_dest == v->
index);
115 for (; v != NULL && (rtl ? px > 0 : px < max_width); v = v->
Next()) {
116 if (dragging && !drag_at_end_of_train && drag_dest == v->index) {
119 px += rtl ? -drag_hlight_width : drag_hlight_width;
125 if (rtl ? px + width > 0 : px - width < max_width) {
128 v->GetImage(dir, image_type, &seq);
129 seq.
Draw(px + (rtl ? -offset.x : offset.x), height / 2 + offset.y, pal, (v->vehstatus &
VS_CRASHED) != 0);
132 if (!v->IsArticulatedPart()) sel_articulated =
false;
134 if (v->index == selection) {
136 highlight_l = rtl ? px - width : px;
137 highlight_r = rtl ? px - 1 : px + width - 1;
138 sel_articulated =
true;
139 }
else if ((_cursor.
vehchain && highlight_r != 0) || sel_articulated) {
141 highlight_l -= width;
143 highlight_r += width;
147 px += rtl ? -width : width;
150 if (dragging && drag_at_end_of_train) {
155 if (highlight_l != highlight_r) {
203 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM;
206 str = item->
cargo ==
INVALID_CARGO ? STR_LTBLUE_STRING : STR_VEHICLE_DETAILS_CARGO_EMPTY;
225 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE);
230 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE);
250 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_INFO_CAPACITY_MULT : STR_VEHICLE_INFO_CAPACITY;
254 str = STR_VEHICLE_INFO_NO_CAPACITY;
276 if (item == summary->
End()) {
282 item->
source = INVALID_STATION;
321 act_cargo[v->cargo_type] += v->cargo.StoredCount();
322 max_cargo[v->cargo_type] += v->cargo_cap;
329 if (max_cargo[i] > 0) num++;
363 int sprite_y_offset = line_height / 2;
370 int x = rtl ? right : left;
371 for (; v != NULL && vscroll_pos > -vscroll_cap; v = v->
GetNextVehicle()) {
381 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
384 if (e->
GetGRF() != NULL) {
390 seq.
Draw(px + (rtl ? -offset.x : offset.x), y - line_height * vscroll_pos + sprite_y_offset + pitch, pal, (v->
vehstatus &
VS_CRASHED) != 0);
392 px += rtl ? -width : width;
398 if (separate_sprite_row) {
403 uint num_lines =
max(1u, _cargo_summary.
Length());
404 for (uint i = 0; i < num_lines; i++) {
406 int data_left = left + (rtl ? 0 : sprite_width);
407 int data_right = right - (rtl ? sprite_width : 0);
408 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
409 int py = y - line_height * vscroll_pos + text_y_offset;
410 if (i > 0 || separate_sprite_row) {
415 if (i < _cargo_summary.
Length()) {
418 DrawString(data_left, data_right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE);
427 if (i < _cargo_summary.
Length()) {
431 DrawString(data_left, data_right, py, STR_VEHICLE_INFO_NO_CAPACITY);
435 default: NOT_REACHED();
444 Money feeder_share = 0;
446 for (
const Vehicle *u = v; u != NULL; u = u->
Next()) {
447 act_cargo[u->cargo_type] += u->cargo.StoredCount();
448 max_cargo[u->cargo_type] += u->cargo_cap;
449 feeder_share += u->cargo.FeederShare();
453 DrawString(left, right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT);
457 if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
463 DrawString(left, right, y + text_y_offset,
FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY);
468 DrawString(left, right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);