summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorterkhen <terkhen@openttd.org>2010-08-13 14:26:29 +0000
committerterkhen <terkhen@openttd.org>2010-08-13 14:26:29 +0000
commitffcd869ddaf368e0c39fcb786137e03b84d53624 (patch)
tree8bcb0e4cf9bf72449f220cffb65fe30ef23b99e8
parent144a7cab1a864ebc1df3c2f06346b812dff7f665 (diff)
downloadopenttd-ffcd869ddaf368e0c39fcb786137e03b84d53624.tar.xz
(svn r20484) -Codechange: Move BuildRefitList to the RefitWindow class.
-rw-r--r--src/vehicle_gui.cpp154
1 files changed, 74 insertions, 80 deletions
diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp
index ddebfeb48..9455426c8 100644
--- a/src/vehicle_gui.cpp
+++ b/src/vehicle_gui.cpp
@@ -308,79 +308,6 @@ struct RefitOption {
typedef SmallVector<RefitOption, 32> RefitList;
/**
- * Collects all (cargo, subcargo) refit-options of a vehicle chain
- * @param v front vehicle
- * @param refit_list container to store result
- */
-static void BuildRefitList(const Vehicle *v, RefitList *refit_list)
-{
- refit_list->Clear();
- Vehicle *u = const_cast<Vehicle *>(v);
-
- do {
- const Engine *e = Engine::Get(u->engine_type);
- uint32 cmask = e->info.refit_mask;
- byte callback_mask = e->info.callback_mask;
-
- /* Skip this engine if it does not carry anything */
- if (!e->CanCarryCargo()) continue;
-
- /* Loop through all cargos in the refit mask */
- const CargoSpec *cs;
- FOR_ALL_SORTED_CARGOSPECS(cs) {
- CargoID cid = cs->Index();
- /* Skip cargo type if it's not listed */
- if (!HasBit(cmask, cid)) continue;
-
- /* Check the vehicle's callback mask for cargo suffixes */
- if (HasBit(callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) {
- /* Make a note of the original cargo type. It has to be
- * changed to test the cargo & subtype... */
- CargoID temp_cargo = u->cargo_type;
- byte temp_subtype = u->cargo_subtype;
-
- u->cargo_type = cid;
-
- for (uint refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE; refit_cyc++) {
- u->cargo_subtype = refit_cyc;
-
- /* Make sure we don't pick up anything cached. */
- u->First()->InvalidateNewGRFCache();
- u->InvalidateNewGRFCache();
- uint16 callback = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, u->engine_type, u);
-
- if (callback == 0xFF) callback = CALLBACK_FAILED;
- if (refit_cyc != 0 && callback == CALLBACK_FAILED) break;
-
- RefitOption option;
- option.cargo = cid;
- option.subtype = refit_cyc;
- option.value = callback;
- option.engine = u->engine_type;
- refit_list->Include(option);
- }
-
- /* Reset the vehicle's cargo type */
- u->cargo_type = temp_cargo;
- u->cargo_subtype = temp_subtype;
-
- /* And make sure we haven't tainted the cache */
- u->First()->InvalidateNewGRFCache();
- u->InvalidateNewGRFCache();
- } else {
- /* No cargo suffix callback -- use no subtype */
- RefitOption option;
- option.cargo = cid;
- option.subtype = 0;
- option.value = CALLBACK_FAILED;
- option.engine = INVALID_ENGINE;
- refit_list->Include(option);
- }
- }
- } while ((v->type == VEH_TRAIN || v->type == VEH_ROAD) && (u = u->Next()) != NULL);
-}
-
-/**
* Draw the list of available refit options for a consist and highlight the selected refit option (if any).
* @param *list First vehicle in consist to get the refit-options of
* @param sel Selected refit cargo-type in the window
@@ -430,6 +357,78 @@ struct RefitWindow : public Window {
VehicleOrderID order; ///< If not #INVALID_VEH_ORDER_ID, selection is part of a refit order (rather than execute directly).
Scrollbar *vscroll;
+ /**
+ * Collects all (cargo, subcargo) refit options of a vehicle chain.
+ */
+ void BuildRefitList()
+ {
+ this->list.Clear();
+ Vehicle *v = Vehicle::Get(this->window_number);
+
+ do {
+ const Engine *e = Engine::Get(v->engine_type);
+ uint32 cmask = e->info.refit_mask;
+ byte callback_mask = e->info.callback_mask;
+
+ /* Skip this engine if it does not carry anything */
+ if (!e->CanCarryCargo()) continue;
+
+ /* Loop through all cargos in the refit mask */
+ const CargoSpec *cs;
+ FOR_ALL_SORTED_CARGOSPECS(cs) {
+ CargoID cid = cs->Index();
+ /* Skip cargo type if it's not listed */
+ if (!HasBit(cmask, cid)) continue;
+
+ /* Check the vehicle's callback mask for cargo suffixes */
+ if (HasBit(callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) {
+ /* Make a note of the original cargo type. It has to be
+ * changed to test the cargo & subtype... */
+ CargoID temp_cargo = v->cargo_type;
+ byte temp_subtype = v->cargo_subtype;
+
+ v->cargo_type = cid;
+
+ for (uint refit_cyc = 0; refit_cyc < MAX_REFIT_CYCLE; refit_cyc++) {
+ v->cargo_subtype = refit_cyc;
+
+ /* Make sure we don't pick up anything cached. */
+ v->First()->InvalidateNewGRFCache();
+ v->InvalidateNewGRFCache();
+ uint16 callback = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, v->engine_type, v);
+
+ if (callback == 0xFF) callback = CALLBACK_FAILED;
+ if (refit_cyc != 0 && callback == CALLBACK_FAILED) break;
+
+ RefitOption option;
+ option.cargo = cid;
+ option.subtype = refit_cyc;
+ option.value = callback;
+ option.engine = v->engine_type;
+ this->list.Include(option);
+ }
+
+ /* Reset the vehicle's cargo type */
+ v->cargo_type = temp_cargo;
+ v->cargo_subtype = temp_subtype;
+
+ /* And make sure we haven't tainted the cache */
+ v->First()->InvalidateNewGRFCache();
+ v->InvalidateNewGRFCache();
+ } else {
+ /* No cargo suffix callback -- use no subtype */
+ RefitOption option;
+ option.cargo = cid;
+ option.subtype = 0;
+ option.value = CALLBACK_FAILED;
+ option.engine = INVALID_ENGINE;
+ this->list.Include(option);
+ }
+ }
+ } while ((v->type == VEH_TRAIN || v->type == VEH_ROAD) && (v = v->Next()) != NULL);
+ this->vscroll->SetCount(this->list.Length());
+ }
+
RefitWindow(const WindowDesc *desc, const Vehicle *v, VehicleOrderID order) : Window()
{
this->CreateNestedTree(desc);
@@ -446,8 +445,6 @@ struct RefitWindow : public Window {
this->order = order;
this->sel = -1;
- BuildRefitList(v, &this->list);
- this->vscroll->SetCount(this->list.Length());
}
virtual void OnInit()
@@ -457,8 +454,7 @@ struct RefitWindow : public Window {
RefitOption current_refit_option = *(this->cargo);
/* Rebuild the refit list */
- BuildRefitList(Vehicle::Get(this->window_number), &this->list);
- this->vscroll->SetCount(this->list.Length());
+ this->BuildRefitList();
this->sel = -1;
this->cargo = NULL;
for (uint i = 0; i < this->list.Length(); i++) {
@@ -525,9 +521,7 @@ struct RefitWindow : public Window {
{
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());
+ this->BuildRefitList();
/* FALL THROUGH */
}