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) {
127 DrawSprite(v->GetImage(dir, image_type), pal, px + (rtl ? -offset.x : offset.x), height / 2 + offset.y);
130 if (!v->IsArticulatedPart()) sel_articulated =
false;
132 if (v->index == selection) {
134 highlight_l = rtl ? px - width : px;
135 highlight_r = rtl ? px - 1 : px + width - 1;
136 sel_articulated =
true;
137 }
else if ((_cursor.
vehchain && highlight_r != 0) || sel_articulated) {
139 highlight_l -= width;
141 highlight_r += width;
145 px += rtl ? -width : width;
148 if (dragging && drag_at_end_of_train) {
153 if (highlight_l != highlight_r) {
201 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_DETAILS_CARGO_FROM_MULT : STR_VEHICLE_DETAILS_CARGO_FROM;
204 str = item->
cargo ==
INVALID_CARGO ? STR_LTBLUE_STRING : STR_VEHICLE_DETAILS_CARGO_EMPTY;
223 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_WAGON_VALUE);
228 DrawString(left, right, y, STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE);
248 str =
FreightWagonMult(item->
cargo) > 1 ? STR_VEHICLE_INFO_CAPACITY_MULT : STR_VEHICLE_INFO_CAPACITY;
252 str = STR_VEHICLE_INFO_NO_CAPACITY;
274 if (item == summary->
End()) {
280 item->
source = INVALID_STATION;
319 act_cargo[v->cargo_type] += v->cargo.StoredCount();
320 max_cargo[v->cargo_type] += v->cargo_cap;
327 if (max_cargo[i] > 0) num++;
361 int sprite_y_offset = line_height / 2;
368 int x = rtl ? right : left;
369 for (; v != NULL && vscroll_pos > -vscroll_cap; v = v->
GetNextVehicle()) {
379 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
382 if (e->
GetGRF() != NULL) {
388 px += rtl ? -width : width;
394 if (separate_sprite_row) {
399 uint num_lines =
max(1u, _cargo_summary.
Length());
400 for (uint i = 0; i < num_lines; i++) {
402 int data_left = left + (rtl ? 0 : sprite_width);
403 int data_right = right - (rtl ? sprite_width : 0);
404 if (vscroll_pos <= 0 && vscroll_pos > -vscroll_cap) {
405 int py = y - line_height * vscroll_pos + text_y_offset;
406 if (i > 0 || separate_sprite_row) {
411 if (i < _cargo_summary.
Length()) {
414 DrawString(data_left, data_right, py, STR_QUANTITY_N_A, TC_LIGHT_BLUE);
423 if (i < _cargo_summary.
Length()) {
427 DrawString(data_left, data_right, py, STR_VEHICLE_INFO_NO_CAPACITY);
431 default: NOT_REACHED();
440 Money feeder_share = 0;
442 for (
const Vehicle *u = v; u != NULL; u = u->
Next()) {
443 act_cargo[u->cargo_type] += u->cargo.StoredCount();
444 max_cargo[u->cargo_type] += u->cargo_cap;
445 feeder_share += u->cargo.FeederShare();
449 DrawString(left, right, y + text_y_offset, STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_TEXT);
453 if (max_cargo[i] > 0 && --vscroll_pos < 0 && vscroll_pos > -vscroll_cap) {
459 DrawString(left, right, y + text_y_offset,
FreightWagonMult(i) > 1 ? STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY_MULT : STR_VEHICLE_DETAILS_TRAIN_TOTAL_CAPACITY);
464 DrawString(left, right, y + text_y_offset, STR_VEHICLE_INFO_FEEDER_CARGO_VALUE);