1
0
Fork 0

(svn r7410) -Codechange/Fix: Remove useless and unfollowable programmatic-resize, and implement it

in a sane way. Correctly specify resize flags for windows and only manually change the
 widgets that the resize system cannot handle (eg centering). This changes r6562, and
 probably some other commits
release/0.5
Darkvater 2006-12-07 00:51:20 +00:00
parent cf385cccf3
commit a518ecbabb
6 changed files with 212 additions and 314 deletions

View File

@ -18,7 +18,6 @@
#include "vehicle_gui.h"
#include "station_map.h"
#include "newgrf_engine.h"
#include "resize_window_widgets.h"
/*
* Since all depot window sizes aren't the same, we need to modify sizes a little.
@ -27,7 +26,7 @@
*/
/* Names of the widgets. Keep them in the same order as in the widget array */
typedef enum DepotWindowWidgets {
enum DepotWindowWidgets {
DEPOT_WIDGET_CLOSEBOX = 0,
DEPOT_WIDGET_CAPTION,
DEPOT_WIDGET_STICKY,
@ -45,28 +44,6 @@ typedef enum DepotWindowWidgets {
DEPOT_WIDGET_STOP_ALL,
DEPOT_WIDGET_START_ALL,
DEPOT_WIDGET_RESIZE,
DEPOT_WIDGET_LAST, // used to assert if DepotWindowWidgets and widget_moves got different lengths. Due to this usage, it needs to be last
} DepotWindowWidget;
/* Define how to move each widget. The order is important */
static const byte widget_moves[] = {
WIDGET_MOVE_NONE, // DEPOT_WIDGET_CLOSEBOX
WIDGET_STRETCH_RIGHT, // DEPOT_WIDGET_CAPTION
WIDGET_MOVE_RIGHT, // DEPOT_WIDGET_STICKY
WIDGET_MOVE_RIGHT_STRETCH_DOWN, // DEPOT_WIDGET_SELL
WIDGET_MOVE_NONE, // DEPOT_WIDGET_SELL_CHAIN
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_SELL_ALL
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_AUTOREPLACE
WIDGET_STRETCH_DOWN_RIGHT, // DEPOT_WIDGET_MATRIX
WIDGET_MOVE_RIGHT_STRETCH_DOWN, // DEPOT_WIDGET_V_SCROLL
WIDGET_MOVE_NONE, // DEPOT_WIDGET_H_SCROLL
WIDGET_MOVE_DOWN, // DEPOT_WIDGET_BUILD
WIDGET_MOVE_DOWN, // DEPOT_WIDGET_CLONE
WIDGET_MOVE_DOWN, // DEPOT_WIDGET_LOCATION
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_VEHICLE_LIST
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_STOP_ALL
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_START_ALL
WIDGET_MOVE_DOWN_RIGHT, // DEPOT_WIDGET_RESIZE
};
/* Widget array for all depot windows.
@ -86,20 +63,20 @@ static const Widget _depot_widgets[] = {
/* Widgets are set up run-time */
{ WWT_IMGBTN, RESIZE_LRB, 14, 270, 292, 14, 37, 0x0, STR_NULL}, // DEPOT_WIDGET_SELL
{ WWT_IMGBTN, RESIZE_LRTB, 14, 326, 348, 0, 0, SPR_SELL_CHAIN_TRAIN,STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP}, // DEPOT_WIDGET_SELL_CHAIN, trains only
{ WWT_IMGBTN, RESIZE_LRTB, 14, 270, 292, 14, 37, SPR_SELL_CHAIN_TRAIN,STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP}, // DEPOT_WIDGET_SELL_CHAIN, trains only
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 270, 292, 38, 60, 0x0, STR_NULL}, // DEPOT_WIDGET_SELL_ALL
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 270, 292, 61, 83, 0x0, STR_NULL}, // DEPOT_WIDGET_AUTOREPLACE
{ WWT_MATRIX, RESIZE_RB, 14, 0, 269, 14, 83, 0x0, STR_NULL}, // DEPOT_WIDGET_MATRIX
{ WWT_SCROLLBAR, RESIZE_LRB, 14, 293, 304, 14, 83, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // DEPOT_WIDGET_V_SCROLL
{ WWT_HSCROLLBAR, RESIZE_RTB, 14, 0, 325, 98, 109, 0x0, STR_HSCROLL_BAR_SCROLLS_LIST}, // DEPOT_WIDGET_H_SCROLL, trains only
{ WWT_HSCROLLBAR, RESIZE_RTB, 14, 0, 269, 72, 83, 0x0, STR_HSCROLL_BAR_SCROLLS_LIST}, // DEPOT_WIDGET_H_SCROLL, trains only
/* The buttons in the bottom of the window. left and right is not important as they are later resized to be equal in size
* This calculation is based on right in DEPOT_WIDGET_LOCATION and it presumes left of DEPOT_WIDGET_BUILD is 0 */
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 85, 84, 95, 0x0, STR_NULL}, // DEPOT_WIDGET_BUILD
{ WWT_TEXTBTN, RESIZE_TB, 14, 86, 170, 84, 95, 0x0, STR_NULL}, // DEPOT_WIDGET_CLONE
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 171, 257, 84, 95, STR_00E4_LOCATION, STR_NULL}, // DEPOT_WIDGET_LOCATION
{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 171, 257, 84, 95, STR_00E4_LOCATION, STR_NULL}, // DEPOT_WIDGET_LOCATION
{ WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 258, 269, 84, 95, 0x0, STR_NULL}, // DEPOT_WIDGET_VEHICLE_LIST
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 270, 280, 84, 95, SPR_FLAG_VEH_STOPPED,STR_NULL}, // DEPOT_WIDGET_STOP_ALL
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 281, 292, 84, 95, SPR_FLAG_VEH_RUNNING,STR_NULL}, // DEPOT_WIDGET_START_ALL
@ -110,7 +87,7 @@ static const Widget _depot_widgets[] = {
static void DepotWndProc(Window *w, WindowEvent *e);
static const WindowDesc _train_depot_desc = {
WDP_AUTO, WDP_AUTO, 361, 122,
WDP_AUTO, WDP_AUTO, 305, 96,
WC_VEHICLE_DEPOT,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
@ -118,7 +95,7 @@ static const WindowDesc _train_depot_desc = {
};
static const WindowDesc _road_depot_desc = {
WDP_AUTO, WDP_AUTO, 315, 96,
WDP_AUTO, WDP_AUTO, 305, 96,
WC_VEHICLE_DEPOT,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
@ -126,7 +103,7 @@ static const WindowDesc _road_depot_desc = {
};
static const WindowDesc _ship_depot_desc = {
WDP_AUTO, WDP_AUTO, 305, 98,
WDP_AUTO, WDP_AUTO, 305, 96,
WC_VEHICLE_DEPOT,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
@ -134,7 +111,7 @@ static const WindowDesc _ship_depot_desc = {
};
static const WindowDesc _aircraft_depot_desc = {
WDP_AUTO, WDP_AUTO, 331, 98,
WDP_AUTO, WDP_AUTO, 305, 96,
WC_VEHICLE_DEPOT,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
@ -596,10 +573,9 @@ static void ClonePlaceObj(const Window *w)
static void ResizeDepotButtons(Window *w)
{
/* We got the widget moved around. Now we will make some widgets to fill the gab between some widgets in equal sizes */
/* We got the widget moved around. Now we will make some widgets to fill the gap between some widgets in equal sizes */
/* Make the buttons in the bottom equal in size */
w->widget[DEPOT_WIDGET_LOCATION].right = w->widget[DEPOT_WIDGET_VEHICLE_LIST].left - 1;
w->widget[DEPOT_WIDGET_BUILD].right = w->widget[DEPOT_WIDGET_LOCATION].right / 3;
w->widget[DEPOT_WIDGET_LOCATION].left = w->widget[DEPOT_WIDGET_BUILD].right * 2;
w->widget[DEPOT_WIDGET_CLONE].left = w->widget[DEPOT_WIDGET_BUILD].right + 1;
@ -608,18 +584,182 @@ static void ResizeDepotButtons(Window *w)
if (WP(w, depot_d).type == VEH_Train) {
/* Divide the size of DEPOT_WIDGET_SELL into two equally big buttons so DEPOT_WIDGET_SELL and DEPOT_WIDGET_SELL_CHAIN will get the same size.
* This way it will stay the same even if DEPOT_WIDGET_SELL_CHAIN is resized for some reason */
w->widget[DEPOT_WIDGET_SELL_CHAIN].bottom = w->widget[DEPOT_WIDGET_SELL_ALL].top - 1;
w->widget[DEPOT_WIDGET_SELL_CHAIN].top = ((w->widget[DEPOT_WIDGET_SELL_CHAIN].bottom - w->widget[DEPOT_WIDGET_SELL].top) / 2) + w->widget[DEPOT_WIDGET_SELL].top;
w->widget[DEPOT_WIDGET_SELL].bottom = w->widget[DEPOT_WIDGET_SELL_CHAIN].top - 1;
}
}
/* Function to set up vehicle specific sprites and strings
* Only use this if it's the same widget, that's used for more than one vehicle type and it needs different text/sprites
* Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the widget array
*/
static void SetupStringsForDepotWindow(Window *w, byte type)
{
switch (type) {
case VEH_Train:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_8800_TRAIN_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_TRAIN_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_883F_TRAINS_CLICK_ON_TRAIN_FOR;
w->widget[DEPOT_WIDGET_BUILD].data = STR_8815_NEW_VEHICLES;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_8840_BUILD_NEW_TRAIN_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_TRAIN;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_TRAIN_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_8842_CENTER_MAIN_VIEW_ON_TRAIN;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_TRAIN;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_TRAIN_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_TRAIN;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_TRAIN;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_TRAIN;
break;
case VEH_Road:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_9003_ROAD_VEHICLE_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_9024_DRAG_ROAD_VEHICLE_TO_HERE;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_9022_VEHICLES_CLICK_ON_VEHICLE;
w->widget[DEPOT_WIDGET_BUILD].data = STR_9004_NEW_VEHICLES;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_9023_BUILD_NEW_ROAD_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_ROAD_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_ROAD_VEHICLE_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_9025_CENTER_MAIN_VIEW_ON_ROAD;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_LORRY;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_ROADVEH_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_ROADVEH;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_ROADVEH;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_ROADVEH;
break;
case VEH_Ship:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_9803_SHIP_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_SHIP_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_SHIP_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_9821_DRAG_SHIP_TO_HERE_TO_SELL;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_981F_SHIPS_CLICK_ON_SHIP_FOR;
w->widget[DEPOT_WIDGET_BUILD].data = STR_9804_NEW_SHIPS;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_9820_BUILD_NEW_SHIP;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_SHIP;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_SHIP_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_9822_CENTER_MAIN_VIEW_ON_SHIP;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_SHIP;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_SHIP_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_SHIP;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_SHIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_SHIP;
break;
case VEH_Aircraft:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_A002_AIRCRAFT_HANGAR;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_HANGAR_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_HANGAR_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_A023_DRAG_AIRCRAFT_TO_HERE_TO;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT;
w->widget[DEPOT_WIDGET_BUILD].data = STR_A003_NEW_AIRCRAFT;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_A022_BUILD_NEW_AIRCRAFT;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_AIRCRAFT;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_A024_CENTER_MAIN_VIEW_ON_HANGAR;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_PLANE;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_AIRCRAFT;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_AIRCRAFT;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_AIRCRAFT;
break;
}
}
static void CreateDepotListWindow(Window *w, byte type)
{
WP(w, depot_d).type = type;
_backup_orders_tile = 0;
/* Resize the window according to the vehicle type */
switch (type) {
default: NOT_REACHED();
case VEH_Train:
w->vscroll.cap = 6;
w->hscroll.cap = 10 * 29;
w->resize.step_width = 1;
ResizeWindow(w, 56, 26);
break;
case VEH_Road:
w->vscroll.cap = 5;
w->hscroll.cap = 5;
w->resize.step_width = 56;
ResizeWindow(w, 10, 0);
break;
case VEH_Ship:
w->vscroll.cap = 3;
w->hscroll.cap = 3;
w->resize.step_width = 90;
ResizeWindow(w, 0, 2);
break;
case VEH_Aircraft:
w->vscroll.cap = 3;
w->hscroll.cap = 4;
w->resize.step_width = 74;
ResizeWindow(w, 26, 2);
break;
}
/* Set the minimum window size to the current window size */
w->resize.width = w->width;
w->resize.height = w->height;
w->resize.step_height = GetVehicleListHeight(type);
SetupStringsForDepotWindow(w, type);
w->widget[DEPOT_WIDGET_MATRIX].data =
(w->vscroll.cap * 0x100) // number of rows to draw on the background
+ (type == VEH_Train ? 1 : w->hscroll.cap); // number of boxes in each row. Trains always have just one
SetWindowWidgetsHiddenState(w, type != VEH_Train,
DEPOT_WIDGET_H_SCROLL,
DEPOT_WIDGET_SELL_CHAIN,
WIDGET_LIST_END);
/* The train depot has a horizontal scroller, make the matrix that much shorter to fit */
if (type == VEH_Train) w->widget[DEPOT_WIDGET_MATRIX].bottom -= 12;
ResizeDepotButtons(w);
}
void DepotSortList(Vehicle **v, uint16 length);
static void DepotWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
case WE_CREATE:
WP(w, depot_d).sel = INVALID_VEHICLE;
WP(w, depot_d).vehicle_list = NULL;
WP(w, depot_d).wagon_list = NULL;
WP(w, depot_d).engine_count = 0;
@ -831,111 +971,6 @@ static void DepotWndProc(Window *w, WindowEvent *e)
}
}
/* Function to set up vehicle specific sprites and strings
* Only use this if it's the same widget, that's used for more than one vehicle type and it needs different text/sprites
* Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the widget array
*/
static void SetupStringsForDepotWindow(Window *w, byte type)
{
switch (type) {
case VEH_Train:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_8800_TRAIN_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_TRAIN_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_883F_TRAINS_CLICK_ON_TRAIN_FOR;
w->widget[DEPOT_WIDGET_BUILD].data = STR_8815_NEW_VEHICLES;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_8840_BUILD_NEW_TRAIN_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_TRAIN;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_TRAIN_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_8842_CENTER_MAIN_VIEW_ON_TRAIN;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_TRAIN;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_TRAIN_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_TRAIN;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_TRAIN;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_TRAIN;
break;
case VEH_Road:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_9003_ROAD_VEHICLE_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_9024_DRAG_ROAD_VEHICLE_TO_HERE;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_9022_VEHICLES_CLICK_ON_VEHICLE;
w->widget[DEPOT_WIDGET_BUILD].data = STR_9004_NEW_VEHICLES;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_9023_BUILD_NEW_ROAD_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_ROAD_VEHICLE;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_ROAD_VEHICLE_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_9025_CENTER_MAIN_VIEW_ON_ROAD;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_LORRY;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_ROADVEH_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_ROADVEH;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_ROADVEH;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_ROADVEH;
break;
case VEH_Ship:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_9803_SHIP_DEPOT;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_SHIP_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_SHIP_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_9821_DRAG_SHIP_TO_HERE_TO_SELL;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_981F_SHIPS_CLICK_ON_SHIP_FOR;
w->widget[DEPOT_WIDGET_BUILD].data = STR_9804_NEW_SHIPS;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_9820_BUILD_NEW_SHIP;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_SHIP;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_SHIP_DEPOT_INFO;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_9822_CENTER_MAIN_VIEW_ON_SHIP;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_SHIP;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_SHIP_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_SHIP;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_SHIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_SHIP;
break;
case VEH_Aircraft:
w->widget[DEPOT_WIDGET_CAPTION].data = STR_A002_AIRCRAFT_HANGAR;
w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_HANGAR_TIP;
w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_HANGAR_TIP;
w->widget[DEPOT_WIDGET_SELL].tooltips = STR_A023_DRAG_AIRCRAFT_TO_HERE_TO;
w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
w->widget[DEPOT_WIDGET_MATRIX].tooltips = STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT;
w->widget[DEPOT_WIDGET_BUILD].data = STR_A003_NEW_AIRCRAFT;
w->widget[DEPOT_WIDGET_BUILD].tooltips = STR_A022_BUILD_NEW_AIRCRAFT;
w->widget[DEPOT_WIDGET_CLONE].data = STR_CLONE_AIRCRAFT;
w->widget[DEPOT_WIDGET_CLONE].tooltips = STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW;
w->widget[DEPOT_WIDGET_LOCATION].tooltips = STR_A024_CENTER_MAIN_VIEW_ON_HANGAR;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].data = STR_PLANE;
w->widget[DEPOT_WIDGET_VEHICLE_LIST].tooltips = STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP;
w->widget[DEPOT_WIDGET_AUTOREPLACE].tooltips = STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP;
/* Sprites */
w->widget[DEPOT_WIDGET_SELL].data = SPR_SELL_AIRCRAFT;
w->widget[DEPOT_WIDGET_SELL_ALL].data = SPR_SELL_ALL_AIRCRAFT;
w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_AIRCRAFT;
break;
}
}
/** Opens a depot window
* @param tile The tile where the depot/hangar is located
* @param type The type of vehicles in the depot
@ -944,93 +979,21 @@ void ShowDepotWindow(TileIndex tile, byte type)
{
Window *w;
/* First we ensure that the widget counts are equal in all 3 lists to prevent bad stuff from happening */
assert(lengthof(widget_moves) == lengthof(_depot_widgets) - 1); // we should not count WIDGETS_END
assert(lengthof(widget_moves) == DEPOT_WIDGET_LAST);
switch (type) {
case VEH_Train: w = AllocateWindowDescFront(&_train_depot_desc, tile); break;
case VEH_Road: w = AllocateWindowDescFront(&_road_depot_desc, tile); break;
case VEH_Ship: w = AllocateWindowDescFront(&_ship_depot_desc, tile); break;
case VEH_Aircraft: w = AllocateWindowDescFront(&_aircraft_depot_desc, tile); break;
default: NOT_REACHED(); w = NULL;
default: NOT_REACHED();
case VEH_Train:
w = AllocateWindowDescFront(&_train_depot_desc, tile); break;
case VEH_Road:
w = AllocateWindowDescFront(&_road_depot_desc, tile); break;
case VEH_Ship:
w = AllocateWindowDescFront(&_ship_depot_desc, tile); break;
case VEH_Aircraft:
w = AllocateWindowDescFront(&_aircraft_depot_desc, tile); break;
}
if (w != NULL) {
int16 horizontal = 0, vertical = 0;
w->caption_color = GetTileOwner(tile);
WP(w, depot_d).type = type;
WP(w, depot_d).sel = INVALID_VEHICLE;
_backup_orders_tile = 0;
/* Resize the window according to the vehicle type */
switch (type) {
case VEH_Train:
horizontal = 56;
vertical = 26;
w->vscroll.cap = 6;
w->hscroll.cap = 10 * 29;
w->resize.step_width = 1;
break;
case VEH_Road:
horizontal = 10;
w->vscroll.cap = 5;
w->hscroll.cap = 5;
w->resize.step_width = 56;
break;
case VEH_Ship:
vertical = 2;
w->vscroll.cap = 3;
w->hscroll.cap = 3;
w->resize.step_width = 90;
break;
case VEH_Aircraft:
horizontal = 26;
vertical = 2;
w->vscroll.cap = 3;
w->hscroll.cap = 4;
w->resize.step_width = 74;
break;
default: NOT_REACHED();
}
w->resize.step_height = GetVehicleListHeight(type);
SetupStringsForDepotWindow(w, type);
w->widget[DEPOT_WIDGET_MATRIX].data =
(w->vscroll.cap * 0x100) // number of rows to draw on the background
+ (type == VEH_Train ? 1 : w->hscroll.cap); // number of boxes in each row. Trains always have just one
SetWindowWidgetsHiddenState(w, type != VEH_Train,
DEPOT_WIDGET_H_SCROLL,
DEPOT_WIDGET_SELL_CHAIN,
WIDGET_LIST_END);
/* Move the widgets to their right locations */
ResizeWindowWidgets(w, widget_moves, lengthof(widget_moves), horizontal, vertical);
if (type == VEH_Train) {
/* Now we move the train only widgets so they are placed correctly
* Doing it here will ensure that they move if the widget they are placed on top of/aligned to are moved */
/* DEPOT_WIDGET_H_SCROLL is placed in the lowest part of DEPOT_WIDGET_MATRIX */
w->widget[DEPOT_WIDGET_H_SCROLL].left = w->widget[DEPOT_WIDGET_MATRIX].left;
w->widget[DEPOT_WIDGET_H_SCROLL].right = w->widget[DEPOT_WIDGET_MATRIX].right;
w->widget[DEPOT_WIDGET_H_SCROLL].bottom = w->widget[DEPOT_WIDGET_MATRIX].bottom;
w->widget[DEPOT_WIDGET_H_SCROLL].top = w->widget[DEPOT_WIDGET_MATRIX].bottom - 11;
w->widget[DEPOT_WIDGET_MATRIX].bottom -= 12;
/* DEPOT_WIDGET_SELL_CHAIN is under DEPOT_WIDGET_SELL. They got the same left and right and height is controlled in ResizeDepotButtons() */
w->widget[DEPOT_WIDGET_SELL_CHAIN].left = w->widget[DEPOT_WIDGET_SELL].left;
w->widget[DEPOT_WIDGET_SELL_CHAIN].right = w->widget[DEPOT_WIDGET_SELL].right;
}
ResizeDepotButtons(w);
CreateDepotListWindow(w, type);
}
}

View File

@ -30,7 +30,6 @@
#include "tgp.h"
#include "settings.h"
#include "date.h"
#include "resize_window_widgets.h"
#include "fios.h"
/* Variables to display file lists */
@ -1858,22 +1857,3 @@ void ShowCheatWindow(void)
DeleteWindowById(WC_CHEATS, 0);
AllocateWindowDesc(&_cheats_desc);
}
/** Resize the widgets in a window
* @param *w Window to resize in
* @param *resizearray Bytearray of the same length as the window contains widgets. Each byte tells how to move the widget of the same index using the flags in resize_window_widgets.h
* @param length Length of the bytearray
* @param horizontal Tells how far to the right the widgets should be moved (note: negative moves left)
* @param vertical Tells how far down the widgets should be moved (note: negative moves up)
*/
void ResizeWindowWidgets(Window *w, const byte *resizearray, int16 length, byte horizontal, int16 vertical)
{
byte i;
for (i = 0; i < length; i++) {
if (resizearray[i] & WIDGET_DEFINE_MOVE_LEFT) w->widget[i].left += horizontal;
if (resizearray[i] & WIDGET_DEFINE_MOVE_RIGHT) w->widget[i].right += horizontal;
if (resizearray[i] & WIDGET_DEFINE_MOVE_TOP) w->widget[i].top += vertical;
if (resizearray[i] & WIDGET_DEFINE_MOVE_BOTTOM) w->widget[i].bottom += vertical;
}
}

View File

@ -625,9 +625,6 @@
<File
RelativePath=".\rail.h">
</File>
<File
RelativePath=".\resize_window_widgets.h">
</File>
<File
RelativePath=".\saveload.h">
</File>

View File

@ -1131,10 +1131,6 @@
RelativePath=".\rail.h"
>
</File>
<File
RelativePath=".\resize_window_widgets.h"
>
</File>
<File
RelativePath=".\road.h"
>

View File

@ -1,31 +0,0 @@
/* $Id$ */
/** @file resize_window_widgets.h */
#ifndef RESIZE_WINDOW_WIDGET_H
#define RESIZE_WINDOW_WIDGET_H
#include "stdafx.h"
#include "window.h"
enum {
WIDGET_DEFINE_MOVE_NONE = 0 << 0,
WIDGET_DEFINE_MOVE_RIGHT = 1 << 0,
WIDGET_DEFINE_MOVE_LEFT = 1 << 1,
WIDGET_DEFINE_MOVE_TOP = 1 << 2,
WIDGET_DEFINE_MOVE_BOTTOM = 1 << 3,
WIDGET_MOVE_NONE = WIDGET_DEFINE_MOVE_NONE,
WIDGET_STRETCH_RIGHT = WIDGET_DEFINE_MOVE_RIGHT,
WIDGET_MOVE_RIGHT = WIDGET_DEFINE_MOVE_RIGHT | WIDGET_DEFINE_MOVE_LEFT,
WIDGET_STRETCH_DOWN = WIDGET_DEFINE_MOVE_BOTTOM,
WIDGET_MOVE_DOWN = WIDGET_DEFINE_MOVE_BOTTOM | WIDGET_DEFINE_MOVE_TOP,
WIDGET_STRETCH_DOWN_RIGHT = WIDGET_STRETCH_DOWN | WIDGET_STRETCH_RIGHT,
WIDGET_MOVE_DOWN_RIGHT = WIDGET_MOVE_RIGHT | WIDGET_MOVE_DOWN,
WIDGET_MOVE_RIGHT_STRETCH_DOWN = WIDGET_MOVE_RIGHT | WIDGET_STRETCH_DOWN,
WIDGET_MOVE_DOWN_STRETCH_RIGHT = WIDGET_MOVE_DOWN | WIDGET_STRETCH_RIGHT,
};
void ResizeWindowWidgets(Window *w, const byte *resizearray, int16 length, byte horizontal, int16 vertical);
#endif

View File

@ -27,7 +27,6 @@
#include "aircraft.h"
#include "roadveh.h"
#include "depot.h"
#include "resize_window_widgets.h"
typedef struct Sorting {
Listing aircraft;
@ -1390,7 +1389,7 @@ enum {
PLY_WND_PRC__SIZE_OF_ROW_BIG = 36,
};
typedef enum VehicleListWindowWidgets {
enum VehicleListWindowWidgets {
VLW_WIDGET_CLOSEBOX = 0,
VLW_WIDGET_CAPTION,
VLW_WIDGET_STICKY,
@ -1406,24 +1405,6 @@ typedef enum VehicleListWindowWidgets {
VLW_WIDGET_STOP_ALL,
VLW_WIDGET_START_ALL,
VLW_WIDGET_RESIZE,
} VehicleListWindowWidget;
static const byte vehicle_list_widget_moves[] = {
WIDGET_MOVE_NONE, // VLW_WIDGET_CLOSEBOX
WIDGET_STRETCH_RIGHT, // VLW_WIDGET_CAPTION
WIDGET_MOVE_RIGHT, // VLW_WIDGET_STICKY
WIDGET_MOVE_NONE, // VLW_WIDGET_SORT_ORDER
WIDGET_MOVE_NONE, // VLW_WIDGET_SORT_BY_TEXT
WIDGET_MOVE_NONE, // VLW_WIDGET_SORT_BY_PULLDOWN
WIDGET_STRETCH_RIGHT, // VLW_WIDGET_EMPTY_SPACE_TOP_RIGHT
WIDGET_STRETCH_DOWN_RIGHT, // VLW_WIDGET_LIST
WIDGET_MOVE_RIGHT_STRETCH_DOWN, // VLW_WIDGET_SCROLLBAR
WIDGET_MOVE_DOWN_STRETCH_RIGHT, // VLW_WIDGET_OTHER_PLAYER_FILLER
WIDGET_MOVE_DOWN, // VLW_WIDGET_SEND_TO_DEPOT
WIDGET_MOVE_DOWN, // VLW_WIDGET_AUTOREPLACE
WIDGET_MOVE_DOWN_RIGHT, // VLW_WIDGET_STOP_ALL
WIDGET_MOVE_DOWN_RIGHT, // VLW_WIDGET_START_ALL
WIDGET_MOVE_DOWN_RIGHT, // VLW_WIDGET_RESIZE
};
static const Widget _vehicle_list_widgets[] = {
@ -1438,7 +1419,7 @@ static const Widget _vehicle_list_widgets[] = {
{ WWT_SCROLLBAR, RESIZE_LRB, 14, 248, 259, 26, 169, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
{ WWT_PANEL, RESIZE_RTB, 14, 0, 247, 170, 181, 0x0, STR_NULL},
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 124, 170, 181, STR_SEND_TO_DEPOTS, STR_NULL},
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 125, 247, 170, 181, STR_REPLACE_VEHICLES, STR_REPLACE_HELP},
{ WWT_PUSHTXTBTN, RESIZE_RTB, 14, 125, 223, 170, 181, STR_REPLACE_VEHICLES, STR_REPLACE_HELP},
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 224, 235, 170, 181, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP},
{ WWT_PUSHIMGBTN, RESIZE_LRTB, 14, 236, 247, 170, 181, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP},
{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 248, 259, 170, 181, 0x0, STR_RESIZE_BUTTON},
@ -1448,7 +1429,6 @@ static const Widget _vehicle_list_widgets[] = {
/* Resize the bottom row of buttons to make them equal in size when resizing */
static void ResizeVehicleListWidgets(Window *w)
{
w->widget[VLW_WIDGET_AUTOREPLACE].right = w->widget[VLW_WIDGET_STOP_ALL].left - 1;
w->widget[VLW_WIDGET_SEND_TO_DEPOT].right = w->widget[VLW_WIDGET_AUTOREPLACE].right / 2;
w->widget[VLW_WIDGET_AUTOREPLACE].left = w->widget[VLW_WIDGET_SEND_TO_DEPOT].right + 1;
}
@ -1572,13 +1552,6 @@ static void CreateVehicleListWindow(Window *w)
vl->l.sort_type = vl->_sorting->criteria;
vl->sort_list = NULL;
vl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS; // Set up resort timer
/* Resize the widgets to fit the window size.
* Aircraft and ships already got the right size widgets */
if (w->resize.step_height == PLY_WND_PRC__SIZE_OF_ROW_SMALL) {
ResizeWindowWidgets(w, vehicle_list_widget_moves, lengthof(vehicle_list_widget_moves), vl->vehicle_type == VEH_Train ? 65 : 0, 38);
}
ResizeVehicleListWidgets(w);
}
static void DrawSmallOrderList(const Vehicle *v, int x, int y)
@ -1827,7 +1800,7 @@ void PlayerVehWndProc(Window *w, WindowEvent *e)
}
static const WindowDesc _player_vehicle_list_train_desc = {
WDP_AUTO, WDP_AUTO, 325, 220,
WDP_AUTO, WDP_AUTO, 260, 182,
WC_TRAINS_LIST, 0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_vehicle_list_widgets,
@ -1835,7 +1808,7 @@ static const WindowDesc _player_vehicle_list_train_desc = {
};
static const WindowDesc _player_vehicle_list_road_veh_desc = {
WDP_AUTO, WDP_AUTO, 260, 220,
WDP_AUTO, WDP_AUTO, 260, 182,
WC_ROADVEH_LIST,0,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_vehicle_list_widgets,
@ -1876,12 +1849,32 @@ static void ShowVehicleListWindowLocal(PlayerID player, byte vehicle_type, Stati
num |= (station << 16) | VLW_STATION_LIST;
}
/* The vehicle list windows have been unified. Just some strings need
* to be changed which happens in the WE_CREATE event and resizing
* some of the windows to the correct size */
switch (vehicle_type) {
case VEH_Train: w = AllocateWindowDescFront(&_player_vehicle_list_train_desc, num); break;
case VEH_Road: w = AllocateWindowDescFront(&_player_vehicle_list_road_veh_desc, num); break;
case VEH_Ship: w = AllocateWindowDescFront(&_player_vehicle_list_ship_desc, num); break;
case VEH_Aircraft: w = AllocateWindowDescFront(&_player_vehicle_list_aircraft_desc, num); break;
default: NOT_REACHED();
case VEH_Train:
w = AllocateWindowDescFront(&_player_vehicle_list_train_desc, num);
if (w != NULL) ResizeWindow(w, 65, 38);
break;
case VEH_Road:
w = AllocateWindowDescFront(&_player_vehicle_list_road_veh_desc, num);
if (w != NULL) ResizeWindow(w, 0, 38);
break;
case VEH_Ship:
w = AllocateWindowDescFront(&_player_vehicle_list_ship_desc, num);
break;
case VEH_Aircraft:
w = AllocateWindowDescFront(&_player_vehicle_list_aircraft_desc, num);
break;
}
if (w != NULL) {
ResizeVehicleListWidgets(w);
/* Set the minimum window size to the current window size */
w->resize.width = w->width;
w->resize.height = w->height;
}
}