src/autoreplace_gui.cpp
author peter1138
Tue, 29 Apr 2008 07:11:54 +0000
changeset 10376 a1207076a5c7
parent 10302 f24c62a9927c
child 10382 d1d4452acbfc
permissions -rw-r--r--
(svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6443
b8f06d8eb7be (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6206
diff changeset
     3
/** @file autoreplace_gui.cpp */
b8f06d8eb7be (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6206
diff changeset
     4
164
0cbdf3c9bde1 (svn r165) -Feature: Option to sort vehicles in vehicle-list window by different criteria. Total independent sort for all types and players. Periodic resort of list every 10 TTD days. Thank you for your graphical inspiration follow and buxo (since none of you provided any code).
darkvater
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1859
diff changeset
     6
#include "openttd.h"
1299
0a6510cc889b (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1294
diff changeset
     7
#include "debug.h"
842
ebfd36603ab9 (svn r1323) Adding autoreplace feature
bjarni
parents: 594
diff changeset
     8
#include "gui.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8610
diff changeset
     9
#include "command_func.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2154
diff changeset
    10
#include "variables.h"
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2154
diff changeset
    11
#include "vehicle_gui.h"
2962
dbd168a4703a (svn r3524) - Split newgrf features from engine.[ch] into newgrf_engine.[ch], and add the new files to project files.
peter1138
parents: 2951
diff changeset
    12
#include "newgrf_engine.h"
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
    13
#include "group.h"
8599
b609cdeeff3f (svn r11664) -Codechange: use more specific ("rail_type.h" instead of "rail.h" that includes way more than only "rail_type.h") includes at some places.
rubidium
parents: 8578
diff changeset
    14
#include "rail.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8602
diff changeset
    15
#include "strings_func.h"
8627
448ebf3a8291 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 8612
diff changeset
    16
#include "window_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8627
diff changeset
    17
#include "vehicle_func.h"
8708
0c29fbc79be4 (svn r11775) -Codechange: move all autoreplace/autorenew functions to a single location.
rubidium
parents: 8670
diff changeset
    18
#include "autoreplace_func.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8708
diff changeset
    19
#include "gfx_func.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8720
diff changeset
    20
#include "player_func.h"
8780
6f3f3ec6c69a (svn r11848) -Codechange: New class-based drop down list functionality. Lists are now dynamically generated, and can include parameters, or be extended however needed.
peter1138
parents: 8760
diff changeset
    21
#include "widgets/dropdown_func.h"
9282
2bb9703aeb39 (svn r12490) -Codechange: rename engine.h to engine_func.h and remove unneeded inclusions of engine.h and/or replace them with engine_type.h.
rubidium
parents: 9266
diff changeset
    22
#include "engine_func.h"
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    23
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    24
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    25
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    26
9266
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    27
struct replaceveh_d {
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    28
	byte sel_index[2];
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    29
	EngineID sel_engine[2];
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    30
	uint16 count[2];
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    31
	bool wagon_btnstate; ///< true means engine is selected
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    32
	EngineList list[2];
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    33
	bool update_left;
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    34
	bool update_right;
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    35
	bool init_lists;
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    36
	GroupID sel_group;
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    37
};
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    38
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(replaceveh_d));
416385a64dcb (svn r12469) -Codechange: split type related stuff from group.h (and openttd.h) to group_type.h.
rubidium
parents: 8975
diff changeset
    39
6060
8388a1bcb7c8 (svn r8371) -Codechange: [autoreplace GUI] moved the autoreplace GUI to a file of it's own
bjarni
parents: 6059
diff changeset
    40
static RailType _railtype_selected_in_replace_gui;
505
11582dcada49 (svn r813) Push two tables from vehicle_gui.h into vehicle_gui.c - they were in the binary 48 (!) times.
tron
parents: 243
diff changeset
    41
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    42
static bool _rebuild_left_list;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    43
static bool _rebuild_right_list;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    44
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    45
static const StringID _rail_types_list[] = {
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    46
	STR_RAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    47
	STR_ELRAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    48
	STR_MONORAIL_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    49
	STR_MAGLEV_VEHICLES,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    50
	INVALID_STRING_ID
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    51
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    52
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    53
enum ReplaceVehicleWindowWidgets {
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    54
	RVW_WIDGET_LEFT_MATRIX = 3,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    55
	RVW_WIDGET_LEFT_SCROLLBAR,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    56
	RVW_WIDGET_RIGHT_MATRIX,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    57
	RVW_WIDGET_RIGHT_SCROLLBAR,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    58
	RVW_WIDGET_LEFT_DETAILS,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    59
	RVW_WIDGET_RIGHT_DETAILS,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    60
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    61
	/* Button row */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    62
	RVW_WIDGET_START_REPLACE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    63
	RVW_WIDGET_INFO_TAB,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    64
	RVW_WIDGET_STOP_REPLACE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    65
	RVW_WIDGET_RESIZE,
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    66
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
    67
	/* Train only widgets */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    68
	RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    69
	RVW_WIDGET_TRAIN_FLUFF_LEFT,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    70
	RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    71
	RVW_WIDGET_TRAIN_FLUFF_RIGHT,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    72
	RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE,
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    73
};
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
    74
8670
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    75
static int CDECL TrainEngineNumberSorter(const void *a, const void *b)
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    76
{
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    77
	const EngineID va = *(const EngineID*)a;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    78
	const EngineID vb = *(const EngineID*)b;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    79
	int r = ListPositionOfEngine(va) - ListPositionOfEngine(vb);
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    80
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    81
	return r;
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    82
}
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
    83
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    84
/* General Vehicle GUI based procedures that are independent of vehicle types */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6443
diff changeset
    85
void InitializeVehiclesGuiList()
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    86
{
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    87
	_railtype_selected_in_replace_gui = RAILTYPE_RAIL;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    88
}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    89
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    90
/** Rebuild the left autoreplace list if an engine is removed or added
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    91
 * @param e Engine to check if it is removed or added
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
    92
 * @param id_g The group the engine belongs to
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    93
 *  Note: this function only works if it is called either
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    94
 *   - when a new vehicle is build, but before it's counted in num_engines
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    95
 *   - when a vehicle is deleted and after it's substracted from num_engines
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
    96
 *   - when not changing the count (used when changing replace orders)
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    97
 */
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
    98
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
    99
{
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   100
	Player *p = GetPlayer(_local_player);
8975
303deb99982d (svn r12054) -Cleanup: Use VehicleType instead of byte for vehicle types...
peter1138
parents: 8915
diff changeset
   101
	VehicleType type = GetEngine(e)->type;
7977
b10b1a884892 (svn r10992) -Fix [FS#1132]: huge amount of vehicles in the "ungrouped" group. Patch by frosch.
rubidium
parents: 7837
diff changeset
   102
	uint num_engines = GetGroupNumEngines(_local_player, id_g, e);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   103
7592
48055c5dd43d (svn r10363) -Fix [FS#911]: invalidating autoreplace windows didn't take account of vehicle group (Matthias Wolf)
peter1138
parents: 7555
diff changeset
   104
	if (num_engines == 0 || p->num_engines[e] == 0) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   105
		/* We don't have any of this engine type.
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   106
		 * Either we just sold the last one, we build a new one or we stopped replacing it.
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   107
		 * In all cases, we need to update the left list */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   108
		_rebuild_left_list = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   109
	} else {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   110
		_rebuild_left_list = false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   111
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   112
	_rebuild_right_list = false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   113
	InvalidateWindowData(WC_REPLACE_VEHICLE, type);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   114
}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   115
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   116
/** When an engine is made buildable or is removed from being buildable, add/remove it from the build/autoreplace lists
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   117
 * @param type The type of engine
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   118
 */
7134
c5a90dd41166 (svn r9869) -Codechange: replace some bytes with VehicleType, i.e. more type strictness.
rubidium
parents: 6894
diff changeset
   119
void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   120
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   121
	_rebuild_left_list = false; // left list is only for the vehicles the player owns and is not related to being buildable
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   122
	_rebuild_right_list = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   123
	InvalidateWindowData(WC_REPLACE_VEHICLE, type); // Update the autoreplace window
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   124
	InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   125
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   126
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   127
/** Get the default cargo type for an engine
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   128
 * @param engine the EngineID to get the cargo for
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   129
 * @return the cargo type carried by the engine (CT_INVALID if engine got no cargo capacity)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   130
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   131
static CargoID EngineCargo(EngineID engine)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   132
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   133
	if (engine == INVALID_ENGINE) return CT_INVALID; // surely INVALID_ENGINE can't carry anything but CT_INVALID
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   134
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   135
	switch (GetEngine(engine)->type) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   136
		default: NOT_REACHED();
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   137
		case VEH_TRAIN:
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   138
			if (RailVehInfo(engine)->capacity == 0) return CT_INVALID; // no capacity -> can't carry cargo
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   139
			return RailVehInfo(engine)->cargo_type;
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   140
		case VEH_ROAD:       return RoadVehInfo(engine)->cargo_type;
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   141
		case VEH_SHIP:       return ShipVehInfo(engine)->cargo_type;
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   142
		case VEH_AIRCRAFT:   return CT_PASSENGERS; // all planes are build with passengers by default
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   143
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   144
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   145
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   146
/** Figure out if an engine should be added to a list
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   147
 * @param e The EngineID
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   148
 * @param draw_left If true, then the left list is drawn (the engines specific to the railtype you selected)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   149
 * @param show_engines if truem then locomotives are drawn, else wagons (never both)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   150
 * @return true if the engine should be in the list (based on this check)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   151
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   152
static bool GenerateReplaceRailList(EngineID e, bool draw_left, bool show_engines)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   153
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   154
	const RailVehicleInfo *rvi = RailVehInfo(e);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   155
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   156
	/* Ensure that the wagon/engine selection fits the engine. */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   157
	if ((rvi->railveh_type == RAILVEH_WAGON) == show_engines) return false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   158
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   159
	if (draw_left && show_engines) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   160
		/* Ensure that the railtype is specific to the selected one */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   161
		if (rvi->railtype != _railtype_selected_in_replace_gui) return false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   162
	} else {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   163
		/* Ensure that it's a compatible railtype to the selected one (like electric <-> diesel)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   164
		 * The vehicle do not have to have power on the railtype in question, only able to drive (pulled if needed) */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   165
		if (!IsCompatibleRail(rvi->railtype, _railtype_selected_in_replace_gui)) return false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   166
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   167
	return true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   168
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   169
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   170
/** Figure out if two engines got at least one type of cargo in common (refitting if needed)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   171
 * @param engine_a one of the EngineIDs
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   172
 * @param engine_b the other EngineID
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   173
 * @return true if they can both carry the same type of cargo (or at least one of them got no capacity at all)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   174
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   175
static bool EnginesGotCargoInCommon(EngineID engine_a, EngineID engine_b)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   176
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   177
	CargoID a = EngineCargo(engine_a);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   178
	CargoID b = EngineCargo(engine_b);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   179
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   180
	 /* we should always be able to refit to/from locomotives without capacity
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   181
	  * Because of that, CT_INVALID shoudl always return true */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   182
	if (a == CT_INVALID || b == CT_INVALID || a == b) return true; // they carry no ro the same type by default
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   183
	if (EngInfo(engine_a)->refit_mask & EngInfo(engine_b)->refit_mask) return true; // both can refit to the same
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   184
	if (CanRefitTo(engine_a, b) || CanRefitTo(engine_b, a)) return true; // one can refit to what the other one carries
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   185
	return false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   186
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   187
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   188
/** Generate a list
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   189
 * @param w Window, that contains the list
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   190
 * @param draw_left true if generating the left list, otherwise false
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   191
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   192
static void GenerateReplaceVehList(Window *w, bool draw_left)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   193
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   194
	EngineID selected_engine = INVALID_ENGINE;
8975
303deb99982d (svn r12054) -Cleanup: Use VehicleType instead of byte for vehicle types...
peter1138
parents: 8915
diff changeset
   195
	VehicleType type = (VehicleType)w->window_number;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   196
	byte i = draw_left ? 0 : 1;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   197
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   198
	EngineList *list = &WP(w, replaceveh_d).list[i];
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   199
	EngList_RemoveAll(list);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   200
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   201
	EngineID eid;
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   202
	FOR_ALL_ENGINEIDS_OF_TYPE(eid, type) {
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   203
		if (type == VEH_TRAIN && !GenerateReplaceRailList(eid, draw_left, WP(w, replaceveh_d).wagon_btnstate)) continue; // special rules for trains
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   204
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   205
		if (draw_left) {
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   206
			const GroupID selected_group = WP(w, replaceveh_d).sel_group;
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   207
			const uint num_engines = GetGroupNumEngines(_local_player, selected_group, eid);
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   208
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   209
			/* Skip drawing the engines we don't have any of and haven't set for replacement */
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   210
			if (num_engines == 0 && EngineReplacementForPlayer(GetPlayer(_local_player), eid, selected_group) == INVALID_ENGINE) continue;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   211
		} else {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   212
			/* This is for engines we can replace to and they should depend on what we selected to replace from */
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   213
			if (!IsEngineBuildable(eid, type, _local_player)) continue; // we need to be able to build the engine
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   214
			if (!EnginesGotCargoInCommon(eid, WP(w, replaceveh_d).sel_engine[0])) continue; // the engines needs to be able to carry the same cargo
7183
23b20a982228 (svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents: 7139
diff changeset
   215
23b20a982228 (svn r9919) -Codechange: prepare some more places for more road types.
rubidium
parents: 7139
diff changeset
   216
			/* Road vehicles can't be replaced by trams and vice-versa */
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   217
			if (type == VEH_ROAD && HasBit(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HasBit(EngInfo(eid)->misc_flags, EF_ROAD_TRAM)) continue;
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   218
			if (eid == WP(w, replaceveh_d).sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   219
		}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   220
10376
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   221
		EngList_Add(list, eid);
a1207076a5c7 (svn r12917) -Codechange: standardise variable names called with FOR_ALL_ENGINEIDS_OF_TYPE
peter1138
parents: 10302
diff changeset
   222
		if (eid == WP(w, replaceveh_d).sel_engine[i]) selected_engine = eid; // The selected engine is still in the list
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   223
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   224
	WP(w, replaceveh_d).sel_engine[i] = selected_engine; // update which engine we selected (the same or none, if it's not in the list anymore)
8670
121000504b2c (svn r11737) -Fix: Reinstate NewGRF-specified engine list order in autoreplace window.
peter1138
parents: 8640
diff changeset
   225
	if (type == VEH_TRAIN) EngList_Sort(list, &TrainEngineNumberSorter);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   226
}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   227
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   228
/** Generate the lists
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   229
 * @param w Window containing the lists
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   230
 */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   231
static void GenerateLists(Window *w)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   232
{
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   233
	EngineID e = WP(w, replaceveh_d).sel_engine[0];
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   234
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   235
	if (WP(w, replaceveh_d).update_left == true) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   236
		/* We need to rebuild the left list */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   237
		GenerateReplaceVehList(w, true);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   238
		SetVScrollCount(w, EngList_Count(&WP(w, replaceveh_d).list[0]));
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   239
		if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE && EngList_Count(&WP(w, replaceveh_d).list[0]) != 0) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   240
			WP(w, replaceveh_d).sel_engine[0] = WP(w, replaceveh_d).list[0][0];
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   241
		}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   242
	}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   243
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   244
	if (WP(w, replaceveh_d).update_right || e != WP(w, replaceveh_d).sel_engine[0]) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   245
		/* Either we got a request to rebuild the right list or the left list selected a different engine */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   246
		if (WP(w, replaceveh_d).sel_engine[0] == INVALID_ENGINE) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   247
			/* Always empty the right list when nothing is selected in the left list */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   248
			EngList_RemoveAll(&WP(w, replaceveh_d).list[1]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   249
			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   250
		} else {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   251
			GenerateReplaceVehList(w, false);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   252
			SetVScroll2Count(w, EngList_Count(&WP(w, replaceveh_d).list[1]));
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   253
			if (WP(w, replaceveh_d).init_lists && WP(w, replaceveh_d).sel_engine[1] == INVALID_ENGINE && EngList_Count(&WP(w, replaceveh_d).list[1]) != 0) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   254
				WP(w, replaceveh_d).sel_engine[1] = WP(w, replaceveh_d).list[1][0];
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   255
			}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   256
		}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   257
	}
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   258
	/* Reset the flags about needed updates */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   259
	WP(w, replaceveh_d).update_left  = false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   260
	WP(w, replaceveh_d).update_right = false;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   261
	WP(w, replaceveh_d).init_lists   = false;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   262
}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   263
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   264
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   265
void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, int count_location, GroupID selected_group);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   266
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   267
static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   268
{
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   269
	/* Strings for the pulldown menu */
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   270
	static const StringID _vehicle_type_names[] = {
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   271
		STR_019F_TRAIN,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   272
		STR_019C_ROAD_VEHICLE,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   273
		STR_019E_SHIP,
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   274
		STR_019D_AIRCRAFT
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   275
	};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   276
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   277
	switch (e->event) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   278
		case WE_CREATE:
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   279
			WP(w, replaceveh_d).wagon_btnstate = true; // start with locomotives (all other vehicles will not read this bool)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   280
			EngList_Create(&WP(w, replaceveh_d).list[0]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   281
			EngList_Create(&WP(w, replaceveh_d).list[1]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   282
			WP(w, replaceveh_d).update_left   = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   283
			WP(w, replaceveh_d).update_right  = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   284
			WP(w, replaceveh_d).init_lists    = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   285
			WP(w, replaceveh_d).sel_engine[0] = INVALID_ENGINE;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   286
			WP(w, replaceveh_d).sel_engine[1] = INVALID_ENGINE;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   287
			break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   288
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   289
		case WE_PAINT: {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   290
			if (WP(w, replaceveh_d).update_left || WP(w, replaceveh_d).update_right) GenerateLists(w);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   291
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   292
			Player *p = GetPlayer(_local_player);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   293
			EngineID selected_id[2];
8578
55218950ce2d (svn r11643) -Codechange: conform with the coding style for the WP macro uses.
rubidium
parents: 8493
diff changeset
   294
			const GroupID selected_group = WP(w, replaceveh_d).sel_group;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   295
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   296
			selected_id[0] = WP(w, replaceveh_d).sel_engine[0];
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   297
			selected_id[1] = WP(w, replaceveh_d).sel_engine[1];
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   298
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   299
			/* Disable the "Start Replacing" button if:
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   300
			 *    Either list is empty
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   301
			 * or The selected replacement engine has a replacement (to prevent loops)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   302
			 * or The right list (new replacement) has the existing replacement vehicle selected */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   303
			w->SetWidgetDisabledState(RVW_WIDGET_START_REPLACE,
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   304
										 selected_id[0] == INVALID_ENGINE ||
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   305
										 selected_id[1] == INVALID_ENGINE ||
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   306
										 EngineReplacementForPlayer(p, selected_id[1], selected_group) != INVALID_ENGINE ||
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   307
										 EngineReplacementForPlayer(p, selected_id[0], selected_group) == selected_id[1]);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   308
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   309
			/* Disable the "Stop Replacing" button if:
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   310
			 *   The left list (existing vehicle) is empty
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   311
			 *   or The selected vehicle has no replacement set up */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   312
			w->SetWidgetDisabledState(RVW_WIDGET_STOP_REPLACE,
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   313
										 selected_id[0] == INVALID_ENGINE ||
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   314
										 !EngineHasReplacementForPlayer(p, selected_id[0], selected_group));
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   315
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   316
			/* now the actual drawing of the window itself takes place */
6206
67358999d80d (svn r8621) -Codechange: assigned new numbers to the VEH_(type) enum so that VEH_Train is 0, VEH_Road is 1 and so on
bjarni
parents: 6195
diff changeset
   317
			SetDParam(0, _vehicle_type_names[w->window_number]);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   318
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   319
			if (w->window_number == VEH_TRAIN) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   320
				/* set on/off for renew_keep_length */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   321
				SetDParam(1, p->renew_keep_length ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   322
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   323
				/* set wagon/engine button */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   324
				SetDParam(2, WP(w, replaceveh_d).wagon_btnstate ? STR_ENGINES : STR_WAGONS);
6894
02bad4ca936e (svn r9528) -Fix r8610: don't try to modify non-existent widgets (many thanks to Bruce Perence, the libefence developer)
glx
parents: 6585
diff changeset
   325
02bad4ca936e (svn r9528) -Fix r8610: don't try to modify non-existent widgets (many thanks to Bruce Perence, the libefence developer)
glx
parents: 6585
diff changeset
   326
				/* sets the colour of that art thing */
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   327
				w->widget[RVW_WIDGET_TRAIN_FLUFF_LEFT].color  = _player_colors[_local_player];
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   328
				w->widget[RVW_WIDGET_TRAIN_FLUFF_RIGHT].color = _player_colors[_local_player];
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   329
			}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   330
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6573
diff changeset
   331
			if (w->window_number == VEH_TRAIN) {
8842
69a6737d61d3 (svn r11912) -Codechange: use dropdown widget for autoreplace, station builder and (second?) vehicle list windows
peter1138
parents: 8841
diff changeset
   332
				/* Show the selected railtype in the pulldown menu */
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   333
				RailType railtype = _railtype_selected_in_replace_gui;
8842
69a6737d61d3 (svn r11912) -Codechange: use dropdown widget for autoreplace, station builder and (second?) vehicle list windows
peter1138
parents: 8841
diff changeset
   334
				w->widget[RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN].data = _rail_types_list[railtype];
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   335
			}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   336
8842
69a6737d61d3 (svn r11912) -Codechange: use dropdown widget for autoreplace, station builder and (second?) vehicle list windows
peter1138
parents: 8841
diff changeset
   337
			DrawWindowWidgets(w);
69a6737d61d3 (svn r11912) -Codechange: use dropdown widget for autoreplace, station builder and (second?) vehicle list windows
peter1138
parents: 8841
diff changeset
   338
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   339
			/* sets up the string for the vehicle that is being replaced to */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   340
			if (selected_id[0] != INVALID_ENGINE) {
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   341
				if (!EngineHasReplacementForPlayer(p, selected_id[0], selected_group)) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   342
					SetDParam(0, STR_NOT_REPLACING);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   343
				} else {
7555
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7183
diff changeset
   344
					SetDParam(0, STR_ENGINE_NAME);
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7183
diff changeset
   345
					SetDParam(1, EngineReplacementForPlayer(p, selected_id[0], selected_group));
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   346
				}
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   347
			} else {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   348
				SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   349
			}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   350
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   351
			DrawString(145, w->widget[RVW_WIDGET_INFO_TAB].top + 1, STR_02BD, TC_BLACK);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   352
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   353
			/* Draw the lists */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   354
			for(byte i = 0; i < 2; i++) {
8848
96987946673f (svn r11918) -Codechange: Draw engine lists at widget positions instead of fixed pixel positions
peter1138
parents: 8842
diff changeset
   355
				uint widget     = (i == 0) ? RVW_WIDGET_LEFT_MATRIX : RVW_WIDGET_RIGHT_MATRIX;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   356
				EngineList list = WP(w, replaceveh_d).list[i]; // which list to draw
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   357
				EngineID start  = i == 0 ? w->vscroll.pos : w->vscroll2.pos; // what is the offset for the start (scrolling)
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   358
				EngineID end    = min((i == 0 ? w->vscroll.cap : w->vscroll2.cap) + start, EngList_Count(&list));
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   359
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   360
				/* Do the actual drawing */
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   361
				DrawEngineList((VehicleType)w->window_number, w->widget[widget].left + 2, w->widget[widget].top + 1, list, start, end, WP(w, replaceveh_d).sel_engine[i], i == 0 ? w->widget[RVW_WIDGET_LEFT_MATRIX].right - 2 : 0, selected_group);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   362
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   363
				/* Also draw the details if an engine is selected */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   364
				if (WP(w, replaceveh_d).sel_engine[i] != INVALID_ENGINE) {
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   365
					const Widget *wi = &w->widget[i == 0 ? RVW_WIDGET_LEFT_DETAILS : RVW_WIDGET_RIGHT_DETAILS];
8915
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   366
					int text_end = DrawVehiclePurchaseInfo(wi->left + 2, wi->top + 1, wi->right - wi->left - 2, WP(w, replaceveh_d).sel_engine[i]);
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   367
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   368
					if (text_end > wi->bottom) {
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   369
						SetWindowDirty(w);
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   370
						ResizeWindowForWidget(w, i == 0 ? RVW_WIDGET_LEFT_DETAILS : RVW_WIDGET_RIGHT_DETAILS, 0, text_end - wi->bottom);
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   371
						SetWindowDirty(w);
db4c2ae09c4b (svn r11989) -Fix: Resize autoreplace window to fit purchase information text if it is too large.
peter1138
parents: 8848
diff changeset
   372
					}
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   373
				}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   374
			}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   375
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   376
		} break;   // end of paint
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   377
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   378
		case WE_CLICK: {
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   379
			switch (e->we.click.widget) {
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   380
				case RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE:
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   381
					WP(w, replaceveh_d).wagon_btnstate = !(WP(w, replaceveh_d).wagon_btnstate);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   382
					WP(w, replaceveh_d).update_left = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   383
					WP(w, replaceveh_d).init_lists  = true;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   384
					SetWindowDirty(w);
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   385
					break;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   386
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   387
				case RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN: /* Railtype selection dropdown menu */
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   388
					ShowDropDownMenu(w, _rail_types_list, _railtype_selected_in_replace_gui, RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN, 0, ~GetPlayer(_local_player)->avail_railtypes);
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   389
					break;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   390
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   391
				case RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE: /* toggle renew_keep_length */
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   392
					DoCommandP(0, 5, GetPlayer(_local_player)->renew_keep_length ? 0 : 1, NULL, CMD_SET_AUTOREPLACE);
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   393
					break;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   394
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   395
				case RVW_WIDGET_START_REPLACE: { /* Start replacing */
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   396
					EngineID veh_from = WP(w, replaceveh_d).sel_engine[0];
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   397
					EngineID veh_to = WP(w, replaceveh_d).sel_engine[1];
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   398
					DoCommandP(0, 3 + (WP(w, replaceveh_d).sel_group << 16) , veh_from + (veh_to << 16), NULL, CMD_SET_AUTOREPLACE);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   399
				} break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   400
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   401
				case RVW_WIDGET_STOP_REPLACE: { /* Stop replacing */
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   402
					EngineID veh_from = WP(w, replaceveh_d).sel_engine[0];
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   403
					DoCommandP(0, 3 + (WP(w, replaceveh_d).sel_group << 16), veh_from + (INVALID_ENGINE << 16), NULL, CMD_SET_AUTOREPLACE);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   404
				} break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   405
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   406
				case RVW_WIDGET_LEFT_MATRIX:
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   407
				case RVW_WIDGET_RIGHT_MATRIX: {
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   408
					uint i = (e->we.click.pt.y - 14) / w->resize.step_height;
8841
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   409
					uint16 click_scroll_pos = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.pos : w->vscroll2.pos;
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   410
					uint16 click_scroll_cap = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? w->vscroll.cap : w->vscroll2.cap;
e015d01a960e (svn r11911) -Codechange: use enum for autoreplace window widgets
peter1138
parents: 8829
diff changeset
   411
					byte click_side         = e->we.click.widget == RVW_WIDGET_LEFT_MATRIX ? 0 : 1;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   412
					uint16 engine_count     = EngList_Count(&WP(w, replaceveh_d).list[click_side]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   413
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   414
					if (i < click_scroll_cap) {
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   415
						i += click_scroll_pos;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   416
						EngineID e = engine_count > i ? WP(w, replaceveh_d).list[click_side][i] : INVALID_ENGINE;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   417
						if (e == WP(w, replaceveh_d).sel_engine[click_side]) break; // we clicked the one we already selected
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   418
						WP(w, replaceveh_d).sel_engine[click_side] = e;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   419
						if (click_side == 0) {
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   420
							WP(w, replaceveh_d).update_right = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   421
							WP(w, replaceveh_d).init_lists   = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   422
						}
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   423
						SetWindowDirty(w);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   424
						}
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   425
					break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   426
					}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   427
			}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   428
			break;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   429
		}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   430
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   431
		case WE_DROPDOWN_SELECT: { /* we have selected a dropdown item in the list */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   432
			RailType temp = (RailType)e->we.dropdown.index;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   433
			if (temp == _railtype_selected_in_replace_gui) break; // we didn't select a new one. No need to change anything
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   434
			_railtype_selected_in_replace_gui = temp;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   435
			/* Reset scrollbar positions */
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   436
			w->vscroll.pos  = 0;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   437
			w->vscroll2.pos = 0;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   438
			/* Rebuild the lists */
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   439
			WP(w, replaceveh_d).update_left  = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   440
			WP(w, replaceveh_d).update_right = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   441
			WP(w, replaceveh_d).init_lists   = true;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   442
			SetWindowDirty(w);
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   443
		} break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   444
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   445
		case WE_RESIZE:
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   446
		{
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   447
			w->vscroll.cap  += e->we.sizing.diff.y / (int)w->resize.step_height;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   448
			w->vscroll2.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   449
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   450
			Widget *widget = w->widget;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   451
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   452
			widget[RVW_WIDGET_LEFT_MATRIX].data = widget[RVW_WIDGET_RIGHT_MATRIX].data = (w->vscroll2.cap << 8) + 1;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   453
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   454
			if (e->we.sizing.diff.x != 0) {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   455
				/* We changed the width of the window so we have to resize the lists.
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   456
				 * Because ResizeButtons() makes each widget the same size it can't be used on the lists
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   457
				 * because then the lists would have the same size as the scrollbars.
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   458
				 * Instead we use it on the detail panels.
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   459
				 * Afterwards we use the new location of the detail panels (the middle of the window)
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   460
				 * to place the lists.
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   461
				 * This way the lists will have equal size while keeping the width of the scrollbars unchanged. */
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   462
				ResizeButtons(w, RVW_WIDGET_LEFT_DETAILS, RVW_WIDGET_RIGHT_DETAILS);
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   463
				widget[RVW_WIDGET_RIGHT_MATRIX].left    = widget[RVW_WIDGET_RIGHT_DETAILS].left;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   464
				widget[RVW_WIDGET_LEFT_SCROLLBAR].right = widget[RVW_WIDGET_LEFT_DETAILS].right;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   465
				widget[RVW_WIDGET_LEFT_SCROLLBAR].left  = widget[RVW_WIDGET_LEFT_SCROLLBAR].right - 11;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   466
				widget[RVW_WIDGET_LEFT_MATRIX].right    = widget[RVW_WIDGET_LEFT_SCROLLBAR].left - 1;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   467
			}
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   468
		} break;
6195
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   469
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   470
		case WE_INVALIDATE_DATA:
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   471
			if (_rebuild_left_list) WP(w, replaceveh_d).update_left = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   472
			if (_rebuild_right_list) WP(w, replaceveh_d).update_right = true;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   473
			SetWindowDirty(w);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   474
			break;
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   475
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   476
		case WE_DESTROY:
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   477
			EngList_RemoveAll(&WP(w, replaceveh_d).list[0]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   478
			EngList_RemoveAll(&WP(w, replaceveh_d).list[1]);
b90cf92697b9 (svn r8610) -Codechange/Feature: rewrote the list handling in the autoreplace window
bjarni
parents: 6144
diff changeset
   479
		break;
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   480
	}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   481
}
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   482
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   483
static const Widget _replace_vehicle_widgets[] = {
10296
a1b48fc82022 (svn r12837) -Codechange: Alignment of widget array
belugas
parents: 9282
diff changeset
   484
{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   485
{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   443,     0,    13, STR_REPLACE_VEHICLES_WHITE,      STR_018C_WINDOW_TITLE_DRAG_THIS},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   486
{  WWT_STICKYBOX,     RESIZE_LR,    14,   444,   455,     0,    13, STR_NULL,                        STR_STICKY_BUTTON},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   487
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   488
{     WWT_MATRIX, RESIZE_BOTTOM,    14,     0,   215,    14,    13, 0x1,                             STR_REPLACE_HELP_LEFT_ARRAY},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   489
{  WWT_SCROLLBAR, RESIZE_BOTTOM,    14,   216,   227,    14,    13, STR_NULL,                        STR_0190_SCROLL_BAR_SCROLLS_LIST},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   490
{     WWT_MATRIX,    RESIZE_LRB,    14,   228,   443,    14,    13, 0x1,                             STR_REPLACE_HELP_RIGHT_ARRAY},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   491
{ WWT_SCROLL2BAR,    RESIZE_LRB,    14,   444,   455,    14,    13, STR_NULL,                        STR_0190_SCROLL_BAR_SCROLLS_LIST},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   492
{      WWT_PANEL,     RESIZE_TB,    14,     0,   227,    14,   105, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   493
{      WWT_PANEL,    RESIZE_RTB,    14,   228,   455,    14,   105, 0x0,                             STR_NULL},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   494
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   495
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   138,   106,   117, STR_REPLACE_VEHICLES_START,      STR_REPLACE_HELP_START_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   496
{      WWT_PANEL,    RESIZE_RTB,    14,   139,   305,   106,   117, 0x0,                             STR_REPLACE_HELP_REPLACE_INFO_TAB},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   497
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   306,   443,   106,   117, STR_REPLACE_VEHICLES_STOP,       STR_REPLACE_HELP_STOP_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   498
{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   444,   455,   106,   117, STR_NULL,                        STR_RESIZE_BUTTON},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   499
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   500
{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   138,   128,   139, STR_REPLACE_ENGINE_WAGON_SELECT, STR_REPLACE_ENGINE_WAGON_SELECT_HELP},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   501
{      WWT_PANEL,     RESIZE_TB,    14,   139,   153,   128,   139, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   502
{   WWT_DROPDOWN,    RESIZE_RTB,    14,   154,   289,   128,   139, 0x0,                             STR_REPLACE_HELP_RAILTYPE},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   503
{      WWT_PANEL,   RESIZE_LRTB,    14,   290,   305,   128,   139, 0x0,                             STR_NULL},
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   504
{ WWT_PUSHTXTBTN,   RESIZE_LRTB,    14,   306,   443,   128,   139, STR_REPLACE_REMOVE_WAGON,        STR_REPLACE_REMOVE_WAGON_HELP},
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   505
{   WIDGETS_END},
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   506
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   507
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   508
static const WindowDesc _replace_rail_vehicle_desc = {
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   509
	WDP_AUTO, WDP_AUTO, 456, 140, 456, 140,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 6119
diff changeset
   510
	WC_REPLACE_VEHICLE, WC_NONE,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   511
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   512
	_replace_vehicle_widgets,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   513
	ReplaceVehicleWndProc
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   514
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   515
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   516
static const WindowDesc _replace_vehicle_desc = {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   517
	WDP_AUTO, WDP_AUTO, 456, 118, 456, 118,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 6119
diff changeset
   518
	WC_REPLACE_VEHICLE, WC_NONE,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   519
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   520
	_replace_vehicle_widgets,
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   521
	ReplaceVehicleWndProc
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   522
};
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   523
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   524
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   525
void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   526
{
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   527
	DeleteWindowById(WC_REPLACE_VEHICLE, vehicletype);
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   528
	Window *w = vehicletype == VEH_TRAIN ? AllocateWindowDescFront(&_replace_rail_vehicle_desc, VEH_TRAIN)
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   529
										 : AllocateWindowDescFront(&_replace_vehicle_desc, vehicletype);
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   530
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   531
	w->resize.step_height = GetVehicleListHeight(vehicletype);
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   532
	w->vscroll.cap = w->resize.step_height == 14 ? 8 : 4;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   533
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   534
	Widget *widget = w->widget;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   535
	widget[RVW_WIDGET_LEFT_MATRIX].data = widget[RVW_WIDGET_RIGHT_MATRIX].data = (w->vscroll.cap << 8) + 1;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   536
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   537
	if (vehicletype == VEH_TRAIN) {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   538
		WP(w, replaceveh_d).wagon_btnstate = true;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   539
		/* The train window is bigger so we will move some of the widgets to fit the new size.
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   540
		 * We will start by moving the resize button to the lower right corner.                 */
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   541
		widget[RVW_WIDGET_RESIZE].top         = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].top;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   542
		widget[RVW_WIDGET_RESIZE].bottom      = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].bottom;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   543
		widget[RVW_WIDGET_STOP_REPLACE].right = widget[RVW_WIDGET_RESIZE].right;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   544
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   545
		/* The detail panel is one line taller for trains so we will move some of the widgets one line (10 pixels) down. */
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   546
		widget[RVW_WIDGET_LEFT_DETAILS].bottom  += 10;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   547
		widget[RVW_WIDGET_RIGHT_DETAILS].bottom += 10;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   548
		for (int i = RVW_WIDGET_START_REPLACE; i < RVW_WIDGET_RESIZE; i++) {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   549
			widget[i].top    += 10;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   550
			widget[i].bottom += 10;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   551
		}
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   552
	} else {
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   553
		/* Since it's not a train we will hide the train only widgets. */
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   554
		w->SetWidgetsHiddenState(true,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   555
								 RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   556
								 RVW_WIDGET_TRAIN_FLUFF_LEFT,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   557
								 RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   558
								 RVW_WIDGET_TRAIN_FLUFF_RIGHT,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   559
								 RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE,
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   560
								 WIDGET_LIST_END);
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   561
	}
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   562
10302
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   563
	ResizeWindow(w, 0, w->resize.step_height * w->vscroll.cap);
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   564
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   565
	/* Set the minimum window size to the current window size */
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   566
	w->resize.width  = w->width;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   567
	w->resize.height = w->height;
f24c62a9927c (svn r12843) -Feature [FS#1945]: The autoreplace window is now resizable in both directions
bjarni
parents: 10296
diff changeset
   568
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   569
	w->caption_color = _local_player;
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   570
	WP(w, replaceveh_d).sel_group = id_g;
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 7134
diff changeset
   571
	w->vscroll2.cap = w->vscroll.cap;   // these two are always the same
6059
14d457867d5e (svn r8370) -Revert (r8363): the autoreplace GUI move cleared the file history
bjarni
parents: 6052
diff changeset
   572
}