From 245e32a10efb0dc924289a8cdec089cd13f3b47d Mon Sep 17 00:00:00 2001 From: michi_cc Date: Sun, 23 Dec 2012 01:00:25 +0000 Subject: (svn r24839) -Feature [FS#5271]: [NewGRF] Support oversized purchase list sprites. (Based on patch by Eddi) --- src/depot_gui.cpp | 69 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 25 deletions(-) (limited to 'src/depot_gui.cpp') diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp index 106d9c95f..731e66b4b 100644 --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -11,6 +11,7 @@ #include "stdafx.h" #include "train.h" +#include "roadveh.h" #include "ship.h" #include "aircraft.h" #include "gui.h" @@ -141,41 +142,63 @@ static void TrainDepotMoveVehicle(const Vehicle *wagon, VehicleID sel, const Veh DoCommandP(v->tile, v->index | (_ctrl_pressed ? 1 : 0) << 20, wagon == NULL ? INVALID_VEHICLE : wagon->index, CMD_MOVE_RAIL_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_MOVE_VEHICLE)); } +static VehicleCellSize _base_block_sizes_depot[VEH_COMPANY_END]; ///< Cell size for vehicle images in the depot view. +static VehicleCellSize _base_block_sizes_purchase[VEH_COMPANY_END]; ///< Cell size for vehicle images in the purchase list. + /** - * Array containing the cell size in pixels of the #WID_D_MATRIX widget for each vehicle type. - * @note The train vehicle type uses the entire row for each train. + * Get the GUI cell size for a vehicle image. + * @param type Vehicle type to get the size for. + * @param image_type Image type to get size for. + * @pre image_type == EIT_IN_DEPOT || image_type == EIT_PURCHASE + * @return Cell dimensions for the vehicle and image type. */ -static Dimension _base_block_sizes[4]; +VehicleCellSize GetVehicleImageCellSize(VehicleType type, EngineImageType image_type) +{ + switch (image_type) { + case EIT_IN_DEPOT: return _base_block_sizes_depot[type]; + case EIT_PURCHASE: return _base_block_sizes_purchase[type]; + default: NOT_REACHED(); + } +} -static void InitBlocksizeForShipAircraft(VehicleType type) +static void InitBlocksizeForVehicles(VehicleType type, EngineImageType image_type) { - uint max_width = 0; + int max_extend_left = 0; + int max_extend_right = 0; uint max_height = 0; const Engine *e; FOR_ALL_ENGINES_OF_TYPE(e, type) { EngineID eid = e->index; uint x, y; + int x_offs, y_offs; switch (type) { default: NOT_REACHED(); - case VEH_SHIP: GetShipSpriteSize( eid, x, y, EIT_IN_DEPOT); break; - case VEH_AIRCRAFT: GetAircraftSpriteSize(eid, x, y, EIT_IN_DEPOT); break; + case VEH_TRAIN: GetTrainSpriteSize( eid, x, y, x_offs, y_offs, image_type); break; + case VEH_ROAD: GetRoadVehSpriteSize( eid, x, y, x_offs, y_offs, image_type); break; + case VEH_SHIP: GetShipSpriteSize( eid, x, y, x_offs, y_offs, image_type); break; + case VEH_AIRCRAFT: GetAircraftSpriteSize(eid, x, y, x_offs, y_offs, image_type); break; } - if (x > max_width) max_width = x; if (y > max_height) max_height = y; + if (-x_offs > max_extend_left) max_extend_left = -x_offs; + if ((int)x + x_offs > max_extend_right) max_extend_right = x + x_offs; } - switch (type) { - default: NOT_REACHED(); - case VEH_SHIP: - _base_block_sizes[VEH_SHIP].width = max(76U, max_width); + switch (image_type) { + case EIT_IN_DEPOT: + _base_block_sizes_depot[type].height = max(GetVehicleHeight(type), max_height); + _base_block_sizes_depot[type].extend_left = Clamp(max_extend_left, 16, 98); + _base_block_sizes_depot[type].extend_right = Clamp(max_extend_right, 16, 98); break; - case VEH_AIRCRAFT: - _base_block_sizes[VEH_AIRCRAFT].width = max(67U, max_width); + case EIT_PURCHASE: + _base_block_sizes_purchase[type].height = max(GetVehicleHeight(type), max_height); + _base_block_sizes_purchase[type].extend_left = Clamp(max_extend_left, 16, 98); + _base_block_sizes_purchase[type].extend_right = Clamp(max_extend_right, 16, 98); break; + + default: NOT_REACHED(); } - _base_block_sizes[type].height = max(GetVehicleHeight(type), max_height); } /** @@ -184,14 +207,10 @@ static void InitBlocksizeForShipAircraft(VehicleType type) */ void InitDepotWindowBlockSizes() { - _base_block_sizes[VEH_TRAIN].width = 0; - _base_block_sizes[VEH_TRAIN].height = GetVehicleHeight(VEH_TRAIN); - - _base_block_sizes[VEH_ROAD].width = 32; - _base_block_sizes[VEH_ROAD].height = GetVehicleHeight(VEH_ROAD); - - InitBlocksizeForShipAircraft(VEH_SHIP); - InitBlocksizeForShipAircraft(VEH_AIRCRAFT); + for (VehicleType vt = VEH_BEGIN; vt < VEH_COMPANY_END; vt++) { + InitBlocksizeForVehicles(vt, EIT_IN_DEPOT); + InitBlocksizeForVehicles(vt, EIT_PURCHASE); + } } static void DepotSellAllConfirmationCallback(Window *w, bool confirmed); @@ -600,13 +619,13 @@ struct DepotWindow : Window { } int base_width = this->count_width + this->header_width; - resize->height = max(_base_block_sizes[this->type].height, min_height); + resize->height = max(GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).height, min_height); if (this->type == VEH_TRAIN) { resize->width = 1; size->width = base_width + 2 * 29; // about 2 parts size->height = resize->height * 6; } else { - resize->width = base_width + _base_block_sizes[this->type].width; + resize->width = base_width + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_left + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_right; size->width = resize->width * (this->type == VEH_ROAD ? 5 : 3); size->height = resize->height * (this->type == VEH_ROAD ? 5 : 3); } -- cgit v1.2.3-54-g00ecf