(svn r20772) -Codechange: use packed VehicleListIdentifiers as window numbers

This commit is contained in:
rubidium 2010-09-08 21:37:13 +00:00
parent 881c6c679f
commit f5128695c5
11 changed files with 129 additions and 79 deletions

View File

@ -16,6 +16,7 @@
#include "window_func.h" #include "window_func.h"
#include "core/pool_func.hpp" #include "core/pool_func.hpp"
#include "vehicle_gui.h" #include "vehicle_gui.h"
#include "vehiclelist.h"
DepotPool _depot_pool("Depot"); DepotPool _depot_pool("Depot");
INSTANTIATE_POOL_METHODS(Depot) INSTANTIATE_POOL_METHODS(Depot)
@ -37,13 +38,14 @@ Depot::~Depot()
DeleteWindowById(WC_VEHICLE_DEPOT, this->xy); DeleteWindowById(WC_VEHICLE_DEPOT, this->xy);
/* Delete the depot list */ /* Delete the depot list */
WindowNumber wno = (this->index << 16) | VLW_DEPOT_LIST | GetTileOwner(this->xy); VehicleType vt;
switch (GetTileType(this->xy)) { switch (GetTileType(this->xy)) {
default: break; // It can happen there is no depot here anymore (TTO/TTD savegames) default: return; // It can happen there is no depot here anymore (TTO/TTD savegames)
case MP_RAILWAY: DeleteWindowById(WC_TRAINS_LIST, wno | (VEH_TRAIN << 11)); break; case MP_RAILWAY: vt = VEH_TRAIN; break;
case MP_ROAD: DeleteWindowById(WC_ROADVEH_LIST, wno | (VEH_ROAD << 11)); break; case MP_ROAD: vt = VEH_ROAD; break;
case MP_WATER: DeleteWindowById(WC_SHIPS_LIST, wno | (VEH_SHIP << 11)); break; case MP_WATER: vt = VEH_SHIP; break;
} }
DeleteWindowById(GetWindowClassForVehicleType(vt), VehicleListIdentifier(VL_DEPOT_LIST, vt, GetTileOwner(this->xy), this->index).Pack());
} }
void InitializeDepots() void InitializeDepots()

View File

@ -16,6 +16,7 @@
#include "string_func.h" #include "string_func.h"
#include "town.h" #include "town.h"
#include "vehicle_gui.h" #include "vehicle_gui.h"
#include "vehiclelist.h"
#include "window_func.h" #include "window_func.h"
#include "table/strings.h" #include "table/strings.h"
@ -71,13 +72,14 @@ CommandCost CmdRenameDepot(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
SetWindowDirty(WC_VEHICLE_DEPOT, d->xy); SetWindowDirty(WC_VEHICLE_DEPOT, d->xy);
/* Update the depot list */ /* Update the depot list */
WindowNumber wno = (d->index << 16) | VLW_DEPOT_LIST | GetTileOwner(d->xy); VehicleType vt;
switch (GetTileType(d->xy)) { switch (GetTileType(d->xy)) {
default: break; default: NOT_REACHED();
case MP_RAILWAY: SetWindowDirty(WC_TRAINS_LIST, wno | (VEH_TRAIN << 11)); break; case MP_RAILWAY: vt = VEH_TRAIN; break;
case MP_ROAD: SetWindowDirty(WC_ROADVEH_LIST, wno | (VEH_ROAD << 11)); break; case MP_ROAD: vt = VEH_ROAD; break;
case MP_WATER: SetWindowDirty(WC_SHIPS_LIST, wno | (VEH_SHIP << 11)); break; case MP_WATER: vt = VEH_SHIP; break;
} }
SetWindowDirty(GetWindowClassForVehicleType(vt), VehicleListIdentifier(VL_DEPOT_LIST, vt, GetTileOwner(d->xy), d->index).Pack());
} }
return CommandCost(); return CommandCost();
} }

View File

@ -15,6 +15,7 @@
#include "group.h" #include "group.h"
#include "train.h" #include "train.h"
#include "vehicle_gui.h" #include "vehicle_gui.h"
#include "vehiclelist.h"
#include "window_func.h" #include "window_func.h"
#include "vehicle_func.h" #include "vehicle_func.h"
#include "autoreplace_base.h" #include "autoreplace_base.h"
@ -95,7 +96,7 @@ CommandCost CmdCreateGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
_new_group_id = g->index; _new_group_id = g->index;
InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(vt), VehicleListIdentifier(VL_GROUP_LIST, vt, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -145,7 +146,7 @@ CommandCost CmdDeleteGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type); DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type);
delete g; delete g;
InvalidateWindowData(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(vt), VehicleListIdentifier(VL_GROUP_LIST, vt, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -190,7 +191,7 @@ CommandCost CmdRenameGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/* Assign the new one */ /* Assign the new one */
g->name = reset ? NULL : strdup(text); g->name = reset ? NULL : strdup(text);
InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), VehicleListIdentifier(VL_GROUP_LIST, g->vehicle_type, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -241,7 +242,7 @@ CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, u
/* Update the Replace Vehicle Windows */ /* Update the Replace Vehicle Windows */
SetWindowDirty(WC_REPLACE_VEHICLE, v->type); SetWindowDirty(WC_REPLACE_VEHICLE, v->type);
InvalidateWindowData(GetWindowClassForVehicleType(v->type), (v->type << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(v->type), VehicleListIdentifier(VL_GROUP_LIST, v->type, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -279,7 +280,7 @@ CommandCost CmdAddSharedVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32
} }
} }
InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(type), VehicleListIdentifier(VL_GROUP_LIST, type, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -317,7 +318,7 @@ CommandCost CmdRemoveAllVehiclesGroup(TileIndex tile, DoCommandFlag flags, uint3
} }
} }
InvalidateWindowData(GetWindowClassForVehicleType(type), (type << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(type), VehicleListIdentifier(VL_GROUP_LIST, type, _current_company).Pack());
} }
return CommandCost(); return CommandCost();
@ -343,7 +344,7 @@ CommandCost CmdSetGroupReplaceProtection(TileIndex tile, DoCommandFlag flags, ui
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
g->replace_protection = HasBit(p2, 0); g->replace_protection = HasBit(p2, 0);
InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_company); InvalidateWindowData(GetWindowClassForVehicleType(g->vehicle_type), VehicleListIdentifier(VL_GROUP_LIST, g->vehicle_type, _current_company).Pack());
InvalidateWindowData(WC_REPLACE_VEHICLE, g->vehicle_type); InvalidateWindowData(WC_REPLACE_VEHICLE, g->vehicle_type);
} }

View File

@ -173,7 +173,8 @@ public:
this->vscroll = this->GetScrollbar(GRP_WIDGET_LIST_VEHICLE_SCROLLBAR); this->vscroll = this->GetScrollbar(GRP_WIDGET_LIST_VEHICLE_SCROLLBAR);
this->group_sb = this->GetScrollbar(GRP_WIDGET_LIST_GROUP_SCROLLBAR); this->group_sb = this->GetScrollbar(GRP_WIDGET_LIST_GROUP_SCROLLBAR);
this->vehicle_type = (VehicleType)GB(window_number, 11, 5); VehicleListIdentifier vli(window_number);
this->vehicle_type = vli.vtype;
switch (this->vehicle_type) { switch (this->vehicle_type) {
default: NOT_REACHED(); default: NOT_REACHED();
case VEH_TRAIN: this->sorting = &_sorting.train; break; case VEH_TRAIN: this->sorting = &_sorting.train; break;
@ -186,11 +187,9 @@ public:
this->vehicle_sel = INVALID_VEHICLE; this->vehicle_sel = INVALID_VEHICLE;
this->group_rename = INVALID_GROUP; this->group_rename = INVALID_GROUP;
const Owner owner = (Owner)GB(window_number, 0, 8);
this->vehicles.SetListing(*this->sorting); this->vehicles.SetListing(*this->sorting);
this->vehicles.ForceRebuild(); this->vehicles.ForceRebuild();
this->vehicles.NeedResort(); this->vehicles.NeedResort();
VehicleListIdentifier vli(IsAllGroupID(this->group_sel) ? VL_STANDARD : VL_GROUP_LIST, this->vehicle_type, owner, this->group_sel);
this->BuildVehicleList(vli); this->BuildVehicleList(vli);
this->SortVehicleList(); this->SortVehicleList();
@ -208,7 +207,7 @@ public:
this->GetWidget<NWidgetCore>(GRP_WIDGET_REPLACE_PROTECTION)->widget_data += this->vehicle_type; this->GetWidget<NWidgetCore>(GRP_WIDGET_REPLACE_PROTECTION)->widget_data += this->vehicle_type;
this->FinishInitNested(desc, window_number); this->FinishInitNested(desc, window_number);
this->owner = owner; this->owner = vli.company;
} }
~VehicleGroupWindow() ~VehicleGroupWindow()
@ -299,11 +298,11 @@ public:
virtual void OnPaint() virtual void OnPaint()
{ {
const Owner owner = (Owner)GB(this->window_number, 0, 8); VehicleListIdentifier vli(this->window_number);
const Owner owner = vli.company;
/* If we select the all vehicles, this->list will contain all vehicles of the owner /* If we select the all vehicles, this->list will contain all vehicles of the owner
* else this->list will contain all vehicles which belong to the selected group */ * else this->list will contain all vehicles which belong to the selected group */
VehicleListIdentifier vli(IsAllGroupID(this->group_sel) ? VL_STANDARD : VL_GROUP_LIST, this->vehicle_type, owner, this->group_sel);
this->BuildVehicleList(vli); this->BuildVehicleList(vli);
this->SortVehicleList(); this->SortVehicleList();
@ -659,7 +658,7 @@ void ShowCompanyGroup(CompanyID company, VehicleType vehicle_type)
{ {
if (!Company::IsValidID(company)) return; if (!Company::IsValidID(company)) return;
WindowNumber num = (vehicle_type << 11) | VLW_GROUP_LIST | company; WindowNumber num = VehicleListIdentifier(VL_GROUP_LIST, vehicle_type, company).Pack();
if (vehicle_type == VEH_TRAIN) { if (vehicle_type == VEH_TRAIN) {
AllocateWindowDescFront<VehicleGroupWindow>(&_train_group_desc, num); AllocateWindowDescFront<VehicleGroupWindow>(&_train_group_desc, num);
} else { } else {
@ -676,7 +675,7 @@ void ShowCompanyGroup(CompanyID company, VehicleType vehicle_type)
*/ */
static inline VehicleGroupWindow *FindVehicleGroupWindow(VehicleType vt, Owner owner) static inline VehicleGroupWindow *FindVehicleGroupWindow(VehicleType vt, Owner owner)
{ {
return (VehicleGroupWindow *)FindWindowById(GetWindowClassForVehicleType(vt), (vt << 11) | VLW_GROUP_LIST | owner); return (VehicleGroupWindow *)FindWindowById(GetWindowClassForVehicleType(vt), VehicleListIdentifier(VL_GROUP_LIST, vt, owner).Pack());
} }
/** /**

View File

@ -19,7 +19,7 @@
#include "command_func.h" #include "command_func.h"
#include "news_func.h" #include "news_func.h"
#include "aircraft.h" #include "aircraft.h"
#include "vehicle_gui.h" #include "vehiclelist.h"
#include "core/pool_func.hpp" #include "core/pool_func.hpp"
#include "station_base.h" #include "station_base.h"
#include "roadstop_base.h" #include "roadstop_base.h"
@ -40,11 +40,10 @@ BaseStation::~BaseStation()
Owner owner = this->owner; Owner owner = this->owner;
if (!Company::IsValidID(owner)) owner = _local_company; if (!Company::IsValidID(owner)) owner = _local_company;
WindowNumber wno = (this->index << 16) | VLW_STATION_LIST | owner; DeleteWindowById(WC_TRAINS_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_TRAIN, owner, this->index).Pack());
DeleteWindowById(WC_TRAINS_LIST, wno | (VEH_TRAIN << 11)); DeleteWindowById(WC_ROADVEH_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_ROAD, owner, this->index).Pack());
DeleteWindowById(WC_ROADVEH_LIST, wno | (VEH_ROAD << 11)); DeleteWindowById(WC_SHIPS_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_SHIP, owner, this->index).Pack());
DeleteWindowById(WC_SHIPS_LIST, wno | (VEH_SHIP << 11)); DeleteWindowById(WC_AIRCRAFT_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_AIRCRAFT, owner, this->index).Pack());
DeleteWindowById(WC_AIRCRAFT_LIST, wno | (VEH_AIRCRAFT << 11));
this->sign.MarkDirty(); this->sign.MarkDirty();
} }

View File

@ -28,6 +28,7 @@
#include "company_base.h" #include "company_base.h"
#include "sortlist_type.h" #include "sortlist_type.h"
#include "core/geometry_func.hpp" #include "core/geometry_func.hpp"
#include "vehiclelist.h"
#include "table/strings.h" #include "table/strings.h"
@ -903,12 +904,11 @@ struct StationViewWindow : public Window {
~StationViewWindow() ~StationViewWindow()
{ {
WindowNumber wno = (this->window_number << 16) | VLW_STATION_LIST | Station::Get(this->window_number)->owner; Owner owner = Station::Get(this->window_number)->owner;
DeleteWindowById(WC_TRAINS_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_TRAIN, owner, this->window_number).Pack(), false);
DeleteWindowById(WC_TRAINS_LIST, wno | (VEH_TRAIN << 11), false); DeleteWindowById(WC_ROADVEH_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_ROAD, owner, this->window_number).Pack(), false);
DeleteWindowById(WC_ROADVEH_LIST, wno | (VEH_ROAD << 11), false); DeleteWindowById(WC_SHIPS_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_SHIP, owner, this->window_number).Pack(), false);
DeleteWindowById(WC_SHIPS_LIST, wno | (VEH_SHIP << 11), false); DeleteWindowById(WC_AIRCRAFT_LIST, VehicleListIdentifier(VL_STATION_LIST, VEH_AIRCRAFT, owner, this->window_number).Pack(), false);
DeleteWindowById(WC_AIRCRAFT_LIST, wno | (VEH_AIRCRAFT << 11), false);
} }
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)

View File

@ -49,6 +49,7 @@
#include "sound_func.h" #include "sound_func.h"
#include "effectvehicle_func.h" #include "effectvehicle_func.h"
#include "effectvehicle_base.h" #include "effectvehicle_base.h"
#include "vehiclelist.h"
#include "table/strings.h" #include "table/strings.h"
@ -1888,7 +1889,7 @@ void Vehicle::RemoveFromShared()
/* Remember if we were first and the old window number before RemoveVehicle() /* Remember if we were first and the old window number before RemoveVehicle()
* as this changes first if needed. */ * as this changes first if needed. */
bool were_first = (this->FirstShared() == this); bool were_first = (this->FirstShared() == this);
uint32 old_window_number = (this->FirstShared()->index << 16) | (this->type << 11) | VLW_SHARED_ORDERS | this->owner; VehicleListIdentifier vli(VL_SHARED_ORDERS, this->type, this->owner, this->FirstShared()->index);
this->orders.list->RemoveVehicle(this); this->orders.list->RemoveVehicle(this);
@ -1902,12 +1903,12 @@ void Vehicle::RemoveFromShared()
if (this->orders.list->GetNumVehicles() == 1) { if (this->orders.list->GetNumVehicles() == 1) {
/* When there is only one vehicle, remove the shared order list window. */ /* When there is only one vehicle, remove the shared order list window. */
DeleteWindowById(GetWindowClassForVehicleType(this->type), old_window_number); DeleteWindowById(GetWindowClassForVehicleType(this->type), vli.Pack());
InvalidateVehicleOrder(this->FirstShared(), 0); InvalidateVehicleOrder(this->FirstShared(), 0);
} else if (were_first) { } else if (were_first) {
/* If we were the first one, update to the new first one. /* If we were the first one, update to the new first one.
* Note: FirstShared() is already the new first */ * Note: FirstShared() is already the new first */
InvalidateWindowData(GetWindowClassForVehicleType(this->type), old_window_number, (this->FirstShared()->index << 16) | (1 << 15)); InvalidateWindowData(GetWindowClassForVehicleType(this->type), vli.Pack(), this->FirstShared()->index | (1U << 31));
} }
this->next_shared = NULL; this->next_shared = NULL;

View File

@ -1085,10 +1085,8 @@ private:
public: public:
VehicleListWindow(const WindowDesc *desc, WindowNumber window_number) : BaseVehicleListWindow() VehicleListWindow(const WindowDesc *desc, WindowNumber window_number) : BaseVehicleListWindow()
{ {
uint16 window_type = window_number & VLW_MASK; VehicleListIdentifier vli(window_number);
CompanyID company = (CompanyID)GB(window_number, 0, 8); this->vehicle_type = vli.vtype;
this->vehicle_type = (VehicleType)GB(window_number, 11, 5);
/* Set up sorting. Make the window-specific _sorting variable /* Set up sorting. Make the window-specific _sorting variable
* point to the correct global _sorting struct so we are freed * point to the correct global _sorting struct so we are freed
@ -1108,21 +1106,20 @@ public:
this->vehicles.SetListing(*this->sorting); this->vehicles.SetListing(*this->sorting);
this->vehicles.ForceRebuild(); this->vehicles.ForceRebuild();
this->vehicles.NeedResort(); this->vehicles.NeedResort();
VehicleListIdentifier vli((VehicleListType)(window_type >> 8), this->vehicle_type, owner, GB(window_number, 16, 16));
this->BuildVehicleList(vli); this->BuildVehicleList(vli);
this->SortVehicleList(); this->SortVehicleList();
/* Set up the window widgets */ /* Set up the window widgets */
this->GetWidget<NWidgetCore>(VLW_WIDGET_LIST)->tool_tip = STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP + this->vehicle_type; this->GetWidget<NWidgetCore>(VLW_WIDGET_LIST)->tool_tip = STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP + this->vehicle_type;
if (window_type == VLW_SHARED_ORDERS) { if (vli.type == VL_SHARED_ORDERS) {
this->GetWidget<NWidgetCore>(VLW_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION; this->GetWidget<NWidgetCore>(VLW_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_SHARED_ORDERS_LIST_CAPTION;
} else { } else {
this->GetWidget<NWidgetCore>(VLW_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_TRAIN_CAPTION + this->vehicle_type; this->GetWidget<NWidgetCore>(VLW_WIDGET_CAPTION)->widget_data = STR_VEHICLE_LIST_TRAIN_CAPTION + this->vehicle_type;
} }
this->FinishInitNested(desc, window_number); this->FinishInitNested(desc, window_number);
this->owner = company; this->owner = vli.company;
if (this->vehicle_type == VEH_TRAIN) ResizeWindow(this, 65, 0); if (this->vehicle_type == VEH_TRAIN) ResizeWindow(this, 65, 0);
} }
@ -1152,7 +1149,7 @@ public:
break; break;
case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: { case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: {
Dimension d = this->GetActionDropdownSize((this->window_number & VLW_MASK) == VLW_STANDARD, false); Dimension d = this->GetActionDropdownSize(VehicleListIdentifier(this->window_number).type == VL_STANDARD, false);
d.height += padding.height; d.height += padding.height;
d.width += padding.width; d.width += padding.width;
*size = maxdim(*size, d); *size = maxdim(*size, d);
@ -1169,9 +1166,9 @@ public:
break; break;
case VLW_WIDGET_CAPTION: { case VLW_WIDGET_CAPTION: {
const uint16 index = GB(this->window_number, 16, 16); VehicleListIdentifier vli(this->window_number);
switch (this->window_number & VLW_MASK) { switch (vli.type) {
case VLW_SHARED_ORDERS: // Shared Orders case VL_SHARED_ORDERS: // Shared Orders
if (this->vehicles.Length() == 0) { if (this->vehicles.Length() == 0) {
/* We can't open this window without vehicles using this order /* We can't open this window without vehicles using this order
* and we should close the window when deleting the order */ * and we should close the window when deleting the order */
@ -1180,22 +1177,22 @@ public:
SetDParam(0, this->vscroll->GetCount()); SetDParam(0, this->vscroll->GetCount());
break; break;
case VLW_STANDARD: // Company Name case VL_STANDARD: // Company Name
SetDParam(0, STR_COMPANY_NAME); SetDParam(0, STR_COMPANY_NAME);
SetDParam(1, index); SetDParam(1, vli.index);
SetDParam(3, this->vscroll->GetCount()); SetDParam(3, this->vscroll->GetCount());
break; break;
case VLW_STATION_LIST: // Station/Waypoint Name case VL_STATION_LIST: // Station/Waypoint Name
SetDParam(0, Station::IsExpected(BaseStation::Get(index)) ? STR_STATION_NAME : STR_WAYPOINT_NAME); SetDParam(0, Station::IsExpected(BaseStation::Get(vli.index)) ? STR_STATION_NAME : STR_WAYPOINT_NAME);
SetDParam(1, index); SetDParam(1, vli.index);
SetDParam(3, this->vscroll->GetCount()); SetDParam(3, this->vscroll->GetCount());
break; break;
case VLW_DEPOT_LIST: case VL_DEPOT_LIST:
SetDParam(0, STR_DEPOT_CAPTION); SetDParam(0, STR_DEPOT_CAPTION);
SetDParam(1, this->vehicle_type); SetDParam(1, this->vehicle_type);
SetDParam(2, index); SetDParam(2, vli.index);
SetDParam(3, this->vscroll->GetCount()); SetDParam(3, this->vscroll->GetCount());
break; break;
default: NOT_REACHED(); default: NOT_REACHED();
@ -1221,9 +1218,8 @@ public:
virtual void OnPaint() virtual void OnPaint()
{ {
const uint16 window_type = this->window_number & VLW_MASK; VehicleListIdentifier vli(this->window_number);
VehicleListIdentifier vli((VehicleListType)(window_type >> 8), this->vehicle_type, this->owner, GB(this->window_number, 16, 16));
this->BuildVehicleList(vli); this->BuildVehicleList(vli);
this->SortVehicleList(); this->SortVehicleList();
@ -1240,7 +1236,7 @@ public:
nwi->SetDirty(this); nwi->SetDirty(this);
} }
if (this->owner == _local_company) { if (this->owner == _local_company) {
this->SetWidgetDisabledState(VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD); this->SetWidgetDisabledState(VLW_WIDGET_AVAILABLE_VEHICLES, vli.type != VL_STANDARD);
this->SetWidgetsDisabledState(this->vehicles.Length() == 0, this->SetWidgetsDisabledState(this->vehicles.Length() == 0,
VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN, VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
VLW_WIDGET_STOP_ALL, VLW_WIDGET_STOP_ALL,
@ -1281,7 +1277,7 @@ public:
break; break;
case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: { case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: {
DropDownList *list = this->BuildActionDropdownList((this->window_number & VLW_MASK) == VLW_STANDARD, false); DropDownList *list = this->BuildActionDropdownList(VehicleListIdentifier(this->window_number).type == VL_STANDARD, false);
ShowDropDownList(this, list, 0, VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN); ShowDropDownList(this, list, 0, VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN);
break; break;
} }
@ -1327,7 +1323,8 @@ public:
{ {
if (_pause_mode != PM_UNPAUSED) return; if (_pause_mode != PM_UNPAUSED) return;
if (this->vehicles.NeedResort()) { if (this->vehicles.NeedResort()) {
StationID station = ((this->window_number & VLW_MASK) == VLW_STATION_LIST) ? GB(this->window_number, 16, 16) : INVALID_STATION; VehicleListIdentifier vli(this->window_number);
StationID station = (vli.type == VL_STATION_LIST) ? vli.index : INVALID_STATION;
DEBUG(misc, 3, "Periodic resort %d list company %d at station %d", this->vehicle_type, this->owner, station); DEBUG(misc, 3, "Periodic resort %d list company %d at station %d", this->vehicle_type, this->owner, station);
this->SetDirty(); this->SetDirty();
@ -1342,8 +1339,10 @@ public:
virtual void OnInvalidateData(int data) virtual void OnInvalidateData(int data)
{ {
if (HasBit(data, 15) && (this->window_number & VLW_MASK) == VLW_SHARED_ORDERS) { VehicleListIdentifier vli(this->window_number);
SB(this->window_number, 16, 16, GB(data, 16, 16)); if (HasBit(data, 31) && vli.type == VL_SHARED_ORDERS) {
vli.index = GB(data, 0, 20);
this->window_number = vli.Pack();
this->vehicles.ForceRebuild(); this->vehicles.ForceRebuild();
return; return;
} }
@ -1363,7 +1362,7 @@ static WindowDesc _vehicle_list_desc(
_nested_vehicle_list, lengthof(_nested_vehicle_list) _nested_vehicle_list, lengthof(_nested_vehicle_list)
); );
static void ShowVehicleListWindowLocal(CompanyID company, uint16 VLW_flag, VehicleType vehicle_type, uint16 unique_number) static void ShowVehicleListWindowLocal(CompanyID company, VehicleListType vlt, VehicleType vehicle_type, uint16 unique_number)
{ {
if (!Company::IsValidID(company)) { if (!Company::IsValidID(company)) {
company = _local_company; company = _local_company;
@ -1377,8 +1376,7 @@ static void ShowVehicleListWindowLocal(CompanyID company, uint16 VLW_flag, Vehic
} }
_vehicle_list_desc.cls = GetWindowClassForVehicleType(vehicle_type); _vehicle_list_desc.cls = GetWindowClassForVehicleType(vehicle_type);
WindowNumber num = (unique_number << 16) | (vehicle_type << 11) | VLW_flag | company; AllocateWindowDescFront<VehicleListWindow>(&_vehicle_list_desc, VehicleListIdentifier(vlt, vehicle_type, company, unique_number).Pack());
AllocateWindowDescFront<VehicleListWindow>(&_vehicle_list_desc, num);
} }
void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type) void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type)
@ -1391,18 +1389,18 @@ void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type)
if ((_settings_client.gui.advanced_vehicle_list > (uint)(company != _local_company)) != _ctrl_pressed) { if ((_settings_client.gui.advanced_vehicle_list > (uint)(company != _local_company)) != _ctrl_pressed) {
ShowCompanyGroup(company, vehicle_type); ShowCompanyGroup(company, vehicle_type);
} else { } else {
ShowVehicleListWindowLocal(company, VLW_STANDARD, vehicle_type, company); ShowVehicleListWindowLocal(company, VL_STANDARD, vehicle_type, company);
} }
} }
void ShowVehicleListWindow(const Vehicle *v) void ShowVehicleListWindow(const Vehicle *v)
{ {
ShowVehicleListWindowLocal(v->owner, VLW_SHARED_ORDERS, v->type, v->FirstShared()->index); ShowVehicleListWindowLocal(v->owner, VL_SHARED_ORDERS, v->type, v->FirstShared()->index);
} }
void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type, StationID station) void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type, StationID station)
{ {
ShowVehicleListWindowLocal(company, VLW_STATION_LIST, vehicle_type, station); ShowVehicleListWindowLocal(company, VL_STATION_LIST, vehicle_type, station);
} }
void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type, TileIndex depot_tile) void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type, TileIndex depot_tile)
@ -1414,7 +1412,7 @@ void ShowVehicleListWindow(CompanyID company, VehicleType vehicle_type, TileInde
} else { } else {
depot_airport_index = GetDepotIndex(depot_tile); depot_airport_index = GetDepotIndex(depot_tile);
} }
ShowVehicleListWindowLocal(company, VLW_DEPOT_LIST, vehicle_type, depot_airport_index); ShowVehicleListWindowLocal(company, VL_DEPOT_LIST, vehicle_type, depot_airport_index);
} }
@ -2263,7 +2261,7 @@ public:
} }
case VVW_WIDGET_GOTO_DEPOT: // goto hangar case VVW_WIDGET_GOTO_DEPOT: // goto hangar
DoCommandP(v->tile, v->index, _ctrl_pressed ? DEPOT_SERVICE : 0U, GetCmdSendToDepot(v)); DoCommandP(v->tile, v->index | (_ctrl_pressed ? DEPOT_SERVICE : 0U), 0, GetCmdSendToDepot(v));
break; break;
case VVW_WIDGET_REFIT_VEH: // refit case VVW_WIDGET_REFIT_VEH: // refit
ShowVehicleRefitWindow(v, INVALID_VEH_ORDER_ID, this); ShowVehicleRefitWindow(v, INVALID_VEH_ORDER_ID, this);

View File

@ -14,6 +14,45 @@
#include "train.h" #include "train.h"
#include "vehiclelist.h" #include "vehiclelist.h"
/**
* Pack a VehicleListIdentifier in a single uint32.
* @return The packed identifier.
*/
uint32 VehicleListIdentifier::Pack()
{
assert(this->company < (1 << 4));
assert(this->type < (1 << 3));
assert(this->vtype < (1 << 2));
assert(this->index < (1 << 20));
return this->company << 28 | this->type << 23 | this->vtype << 26 | this->index;
}
/**
* Unpack a VehicleListIdentifier from a single uint32.
* @param data The data to unpack.
* @return true iff the data was valid (enough).
*/
bool VehicleListIdentifier::Unpack(uint32 data)
{
this->company = (CompanyID)GB(data, 28, 4);
this->type = (VehicleListType)GB(data, 23, 3);
this->vtype = (VehicleType)GB(data, 26, 2);
this->index = GB(data, 0, 20);
return this->type < VLT_END;
}
/**
* Decode a packed vehicle list identifier into a new one.
* @param data The data to unpack.
*/
VehicleListIdentifier::VehicleListIdentifier(uint32 data)
{
bool ret = this->Unpack(data);
assert(ret);
}
/** /**
* Generate a list of vehicles inside a depot. * Generate a list of vehicles inside a depot.
* @param type Type of vehicle * @param type Type of vehicle
@ -76,7 +115,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
switch (vli.type) { switch (vli.type) {
case VL_STATION_LIST: case VL_STATION_LIST:
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == vli.type && v->IsPrimaryVehicle()) { if (v->type == vli.vtype && v->IsPrimaryVehicle()) {
const Order *order; const Order *order;
FOR_VEHICLE_ORDERS(v, order) { FOR_VEHICLE_ORDERS(v, order) {
@ -93,7 +132,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
case VL_SHARED_ORDERS: case VL_SHARED_ORDERS:
/* Add all vehicles from this vehicle's shared order list */ /* Add all vehicles from this vehicle's shared order list */
v = Vehicle::GetIfValid(vli.index); v = Vehicle::GetIfValid(vli.index);
if (v == NULL || v->type != vli.type || !v->IsPrimaryVehicle()) return false; if (v == NULL || v->type != vli.vtype || !v->IsPrimaryVehicle()) return false;
for (; v != NULL; v = v->NextShared()) { for (; v != NULL; v = v->NextShared()) {
*list->Append() = v; *list->Append() = v;
@ -102,7 +141,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
case VL_STANDARD: case VL_STANDARD:
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == vli.type && v->owner == vli.company && v->IsPrimaryVehicle()) { if (v->type == vli.vtype && v->owner == vli.company && v->IsPrimaryVehicle()) {
*list->Append() = v; *list->Append() = v;
} }
} }
@ -110,7 +149,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
case VL_DEPOT_LIST: case VL_DEPOT_LIST:
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == vli.type && v->IsPrimaryVehicle()) { if (v->type == vli.vtype && v->IsPrimaryVehicle()) {
const Order *order; const Order *order;
FOR_VEHICLE_ORDERS(v, order) { FOR_VEHICLE_ORDERS(v, order) {
@ -125,7 +164,7 @@ bool GenerateVehicleSortList(VehicleList *list, const VehicleListIdentifier &vli
case VL_GROUP_LIST: case VL_GROUP_LIST:
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (v->type == vli.type && v->IsPrimaryVehicle() && if (v->type == vli.vtype && v->IsPrimaryVehicle() &&
v->owner == vli.company && v->group_id == vli.index) { v->owner == vli.company && v->group_id == vli.index) {
*list->Append() = v; *list->Append() = v;
} }

View File

@ -34,6 +34,9 @@ struct VehicleListIdentifier {
CompanyID company; ///< The company associated with this list. CompanyID company; ///< The company associated with this list.
uint32 index; ///< A vehicle list type specific index. uint32 index; ///< A vehicle list type specific index.
uint32 Pack();
bool Unpack(uint32 data);
/** /**
* Create a simple vehicle list. * Create a simple vehicle list.
* @param type List type. * @param type List type.
@ -43,6 +46,11 @@ struct VehicleListIdentifier {
*/ */
VehicleListIdentifier(VehicleListType type, VehicleType vtype, CompanyID company, uint index = 0) : VehicleListIdentifier(VehicleListType type, VehicleType vtype, CompanyID company, uint index = 0) :
type(type), vtype(vtype), company(company), index(index) {} type(type), vtype(vtype), company(company), index(index) {}
VehicleListIdentifier(uint32 data);
/** Simple empty constructor. In this case you must set everything! */
VehicleListIdentifier() {}
}; };
typedef SmallVector<const Vehicle *, 32> VehicleList; typedef SmallVector<const Vehicle *, 32> VehicleList;

View File

@ -13,6 +13,7 @@
#include "window_gui.h" #include "window_gui.h"
#include "gui.h" #include "gui.h"
#include "textbuf_gui.h" #include "textbuf_gui.h"
#include "vehiclelist.h"
#include "vehicle_gui.h" #include "vehicle_gui.h"
#include "viewport_func.h" #include "viewport_func.h"
#include "strings_func.h" #include "strings_func.h"
@ -65,7 +66,7 @@ public:
{ {
Owner owner = this->owner; Owner owner = this->owner;
if (!Company::IsValidID(owner)) owner = _local_company; if (!Company::IsValidID(owner)) owner = _local_company;
DeleteWindowById(GetWindowClassForVehicleType(this->vt), (this->window_number << 16) | (this->vt << 11) | VLW_STATION_LIST | owner, false); DeleteWindowById(GetWindowClassForVehicleType(this->vt), VehicleListIdentifier(VL_STATION_LIST, this->vt, owner, this->window_number).Pack(), false);
} }
virtual void SetStringParameters(int widget) const virtual void SetStringParameters(int widget) const