Mercurial > hg > openttd
changeset 14938:80b5c3338f03 draft
(svn r19541) -Feature: Sort the list of refit options by cargo class / name.
author | terkhen <terkhen@openttd.org> |
---|---|
date | Fri, 02 Apr 2010 12:28:08 +0000 |
parents | 205fdbada4d7 |
children | d5e618321973 |
files | src/vehicle_gui.cpp |
diffstat | 1 files changed, 35 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -234,6 +234,11 @@ { return other.cargo != this->cargo || other.value != this->value; } + + FORCEINLINE bool operator == (const RefitOption &other) const + { + return other.cargo == this->cargo && other.value == this->value; + } }; typedef SmallVector<RefitOption, 32> RefitList; @@ -258,7 +263,7 @@ /* Loop through all cargos in the refit mask */ const CargoSpec *cs; - FOR_ALL_CARGOSPECS(cs) { + FOR_ALL_SORTED_CARGOSPECS(cs) { CargoID cid = cs->Index(); /* Skip cargo type if it's not listed */ if (!HasBit(cmask, cid)) continue; @@ -380,6 +385,35 @@ this->vscroll.SetCount(this->list.Length()); } + virtual void OnInit() + { + if (this->cargo != NULL) { + /* Store the RefitOption currently in use. */ + 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->sel = -1; + this->cargo = NULL; + for (uint i = 0; i < this->list.Length(); i++) { + if (this->list[i] == current_refit_option) { + this->sel = i; + this->cargo = &this->list[i]; + this->vscroll.ScrollTowards(i); + break; + } + } + + /* If the selected refit option was not found, scroll the window to the initial position. */ + 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()); + } + } + virtual void OnPaint() { Vehicle *v = Vehicle::Get(this->window_number);