summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/train_cmd.cpp3
-rw-r--r--src/vehicle_gui.cpp40
2 files changed, 21 insertions, 22 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index cc2d2d768..3143624bd 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -266,6 +266,7 @@ void Train::ConsistChanged(bool same_length)
if (this->IsFrontEngine()) {
this->UpdateAcceleration();
SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
+ InvalidateWindowData(WC_VEHICLE_REFIT, this->index);
}
}
@@ -1144,7 +1145,7 @@ static void NormaliseTrainHead(Train *head)
if (!head->IsFrontEngine()) return;
/* Update the refit button and window */
- SetWindowDirty(WC_VEHICLE_REFIT, head->index);
+ InvalidateWindowData(WC_VEHICLE_REFIT, head->index);
SetWindowWidgetDirty(WC_VEHICLE_VIEW, head->index, VVW_WIDGET_REFIT_VEH);
/* If we don't have a unit number yet, set one. */
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index ebb0ff47d..e9a9839d6 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -362,7 +362,6 @@ struct RefitWindow : public Window {
int sel; ///< Index in refit options, \c -1 if nothing is selected.
RefitOption *cargo; ///< Refit option selected by \v sel.
RefitList list; ///< List of cargo types available for refitting.
- uint length; ///< For trains, the number of vehicles.
VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly).
RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window()
@@ -381,7 +380,6 @@ struct RefitWindow : public Window {
this->order = order;
this->sel = -1;
BuildRefitList(v, &this->list);
- if (v->type == VEH_TRAIN) this->length = CountVehiclesInChain(v);
this->vscroll.SetCount(this->list.Length());
}
@@ -409,28 +407,12 @@ struct RefitWindow : public Window {
if (this->sel == -1) this->vscroll.ScrollTowards(0);
} else {
/* Rebuild the refit list */
- BuildRefitList(Vehicle::Get(this->window_number), &this->list);
- this->vscroll.SetCount(this->list.Length());
+ this->OnInvalidateData(0);
}
}
virtual void OnPaint()
{
- Vehicle *v = Vehicle::Get(this->window_number);
-
- if (v->type == VEH_TRAIN) {
- uint length = CountVehiclesInChain(v);
-
- if (length != this->length) {
- /* Consist length has changed, so rebuild the refit list */
- BuildRefitList(v, &this->list);
- this->length = length;
- }
- }
-
- this->vscroll.SetCount(this->list.Length());
-
- this->cargo = (this->sel >= 0 && this->sel < (int)this->list.Length()) ? &this->list[this->sel] : NULL;
this->DrawWidgets();
}
@@ -472,6 +454,22 @@ struct RefitWindow : public Window {
}
}
+ virtual void OnInvalidateData(int data)
+ {
+ switch (data) {
+ case 0: { // The consist lenght of the vehicle has changed; rebuild the entire list.
+ Vehicle *v = Vehicle::Get(this->window_number);
+ BuildRefitList(v, &this->list);
+ this->vscroll.SetCount(this->list.Length());
+ }
+ /* FALLTHROUGH */
+
+ case 1: // A new cargo has been selected.
+ this->cargo = (this->sel >= 0 && this->sel < (int)this->list.Length()) ? &this->list[this->sel] : NULL;
+ break;
+ }
+ }
+
virtual void OnClick(Point pt, int widget, int click_count)
{
switch (widget) {
@@ -479,9 +477,9 @@ struct RefitWindow : public Window {
int y = pt.y - this->GetWidget<NWidgetBase>(VRW_MATRIX)->pos_y;
if (y >= 0) {
this->sel = (y / (int)this->resize.step_height) + this->vscroll.GetPosition();
- this->SetDirty();
+ this->InvalidateData(1);
}
- /* FIXME We need to call some InvalidateData to make this->cargo valid */
+
if (click_count == 1) break;
}
/* FALL THROUGH */