Fix: Vehicle list windows did not update when this year's profit changed

Remove caching from vehicle group object. and recalculate it whenever
required instead.

(cherry picked from commit 6b8f9b50b9)

# Conflicts:
#	src/vehicle_gui.cpp
pull/221/head
Charles Pigott 3 years ago committed by Jonathan G Rennison
parent dbbe1bb3e4
commit 7e39d78fc3

@ -235,7 +235,7 @@ void BaseVehicleListWindow::BuildVehicleList()
if (this->grouping == GB_NONE) {
uint max_unitnumber = 0;
for (auto it = this->vehicles.begin(); it != this->vehicles.end(); ++it) {
this->vehgroups.emplace_back(it, it + 1, (*it)->GetDisplayProfitThisYear(), (*it)->GetDisplayProfitLastYear(), (*it)->age);
this->vehgroups.emplace_back(it, it + 1);
max_unitnumber = std::max<uint>(max_unitnumber, (*it)->unitnumber);
}
@ -254,17 +254,7 @@ void BaseVehicleListWindow::BuildVehicleList()
return v->FirstShared() == first_shared;
});
Money display_profit_this_year = 0;
Money display_profit_last_year = 0;
Date age = 0;
for (auto it = begin; it != end; ++it) {
const Vehicle * const v = (*it);
display_profit_this_year += v->GetDisplayProfitThisYear();
display_profit_last_year += v->GetDisplayProfitLastYear();
age = std::max<Date>(age, v->age);
}
this->vehgroups.emplace_back(begin, end, display_profit_this_year, display_profit_last_year, age);
this->vehgroups.emplace_back(begin, end);
max_num_vehicles = std::max<uint>(max_num_vehicles, static_cast<uint>(end - begin));
@ -1459,25 +1449,25 @@ static bool VehicleGroupLengthSorter(const GUIVehicleGroup &a, const GUIVehicleG
/** Sort vehicle groups by the total profit this year */
static bool VehicleGroupTotalProfitThisYearSorter(const GUIVehicleGroup &a, const GUIVehicleGroup &b)
{
return a.display_profit_this_year < b.display_profit_this_year;
return a.GetDisplayProfitThisYear() < b.GetDisplayProfitThisYear();
}
/** Sort vehicle groups by the total profit last year */
static bool VehicleGroupTotalProfitLastYearSorter(const GUIVehicleGroup &a, const GUIVehicleGroup &b)
{
return a.display_profit_last_year < b.display_profit_last_year;
return a.GetDisplayProfitLastYear() < b.GetDisplayProfitLastYear();
}
/** Sort vehicle groups by the average profit this year */
static bool VehicleGroupAverageProfitThisYearSorter(const GUIVehicleGroup &a, const GUIVehicleGroup &b)
{
return a.display_profit_this_year * static_cast<uint>(b.NumVehicles()) < b.display_profit_this_year * static_cast<uint>(a.NumVehicles());
return a.GetDisplayProfitThisYear() * static_cast<uint>(b.NumVehicles()) < b.GetDisplayProfitThisYear() * static_cast<uint>(a.NumVehicles());
}
/** Sort vehicle groups by the average profit last year */
static bool VehicleGroupAverageProfitLastYearSorter(const GUIVehicleGroup &a, const GUIVehicleGroup &b)
{
return a.display_profit_last_year * static_cast<uint>(b.NumVehicles()) < b.display_profit_last_year * static_cast<uint>(a.NumVehicles());
return a.GetDisplayProfitLastYear() * static_cast<uint>(b.NumVehicles()) < b.GetDisplayProfitLastYear() * static_cast<uint>(a.NumVehicles());
}
/** Sort vehicles by their number */
@ -1946,12 +1936,12 @@ void BaseVehicleListWindow::DrawVehicleListItems(VehicleID selected_vehicle, int
GfxFillRect((text_right - 1) - (FONT_HEIGHT_SMALL - 2), y + 1, text_right - 1, (y + 1) + (FONT_HEIGHT_SMALL - 2), ccolour, FILLRECT_OPAQUE);
}
} else {
SetDParam(0, vehgroup.display_profit_this_year);
SetDParam(1, vehgroup.display_profit_last_year);
SetDParam(0, vehgroup.GetDisplayProfitThisYear());
SetDParam(1, vehgroup.GetDisplayProfitLastYear());
DrawString(text_left, text_right, y + line_height - FONT_HEIGHT_SMALL - WD_FRAMERECT_BOTTOM - 1, STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR);
}
DrawVehicleProfitButton(vehgroup.age, vehgroup.display_profit_last_year, vehgroup.NumVehicles(), vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3);
DrawVehicleProfitButton(vehgroup.GetOldestVehicleAge(), vehgroup.GetDisplayProfitLastYear(), vehgroup.NumVehicles(), vehicle_button_x, y + FONT_HEIGHT_NORMAL + 3);
switch (this->grouping) {
case GB_NONE: {

@ -14,32 +14,54 @@
#include "date_type.h"
#include "economy_type.h"
#include "sortlist_type.h"
#include "vehicle_base.h"
#include "vehiclelist.h"
#include "window_gui.h"
#include "widgets/dropdown_type.h"
#include "cargo_type.h"
#include <iterator>
#include <numeric>
typedef GUIList<const Vehicle*, CargoID> GUIVehicleList;
struct GUIVehicleGroup {
VehicleList::const_iterator vehicles_begin; ///< Pointer to beginning element of this vehicle group.
VehicleList::const_iterator vehicles_end; ///< Pointer to past-the-end element of this vehicle group.
Money display_profit_this_year; ///< Total profit for the vehicle group this year.
Money display_profit_last_year; ///< Total profit for the vehicle group laste year.
Date age; ///< Age in days of oldest vehicle in the group.
GUIVehicleGroup(VehicleList::const_iterator vehicles_begin, VehicleList::const_iterator vehicles_end, Money display_profit_this_year, Money display_profit_last_year, Date age)
: vehicles_begin(vehicles_begin), vehicles_end(vehicles_end), display_profit_this_year(display_profit_this_year), display_profit_last_year(display_profit_last_year), age(age) {}
GUIVehicleGroup(VehicleList::const_iterator vehicles_begin, VehicleList::const_iterator vehicles_end)
: vehicles_begin(vehicles_begin), vehicles_end(vehicles_end) {}
std::ptrdiff_t NumVehicles() const
{
return std::distance(vehicles_begin, vehicles_end);
return std::distance(this->vehicles_begin, this->vehicles_end);
}
const Vehicle *GetSingleVehicle() const
{
assert(NumVehicles() == 1);
return vehicles_begin[0];
assert(this->NumVehicles() == 1);
return this->vehicles_begin[0];
}
Money GetDisplayProfitThisYear() const
{
return std::accumulate(this->vehicles_begin, this->vehicles_end, (Money)0, [](Money acc, const Vehicle *v) {
return acc + v->GetDisplayProfitThisYear();
});
}
Money GetDisplayProfitLastYear() const
{
return std::accumulate(this->vehicles_begin, this->vehicles_end, (Money)0, [](Money acc, const Vehicle *v) {
return acc + v->GetDisplayProfitLastYear();
});
}
Date GetOldestVehicleAge() const
{
const Vehicle *oldest = *std::max_element(this->vehicles_begin, this->vehicles_end, [](const Vehicle *v_a, const Vehicle *v_b) {
return v_a->age < v_b->age;
});
return oldest->age;
}
};

Loading…
Cancel
Save