src/bridge_gui.cpp
author smatz
Wed, 24 Sep 2008 16:40:06 +0000
changeset 10184 bf4e3ff4cf16
parent 10140 5c9f3aea73a5
permissions -rw-r--r--
(svn r14395) -Fix [FS#2285]: crashes and GUI desyncs when order is deleted/modified while the timetable window is open
-Fix: close any dropdown and child windows in the Order and Timetable windows when selected order is deselected, deleted, ...
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6117
6507b2a7e71d (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: 5931
diff changeset
     3
/** @file bridge_gui.cpp Graphical user interface for bridge construction */
2262
252cfd94c54d (svn r2782) -Codechange: Started cleaning the bridge code. Removed numerous global variables containing bridge information and joined them in a struct. Introduced GetBridgeType and GetBridgePiece and fixed some minor stuff (whitespace etc)
celestar
parents: 2186
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
862800791170 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1781
diff changeset
     6
#include "openttd.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     7
#include "gui.h"
8107
bb7deea89175 (svn r11668) -Codechange: more refactoring aimed at reducing compile time and making it more logic where function definitions can be found.
rubidium
parents: 8106
diff changeset
     8
#include "window_gui.h"
8116
8da76dcb3287 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8114
diff changeset
     9
#include "command_func.h"
8da76dcb3287 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8114
diff changeset
    10
#include "economy_func.h"
2159
f6284cf5fab0 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2133
diff changeset
    11
#include "variables.h"
2262
252cfd94c54d (svn r2782) -Codechange: Started cleaning the bridge code. Removed numerous global variables containing bridge information and joined them in a struct. Introduced GetBridgeType and GetBridgePiece and fixed some minor stuff (whitespace etc)
celestar
parents: 2186
diff changeset
    12
#include "bridge.h"
8114
dd6d21dc99c1 (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8107
diff changeset
    13
#include "strings_func.h"
8131
160939e24ed3 (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: 8121
diff changeset
    14
#include "window_func.h"
8157
1505def01945 (svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents: 8139
diff changeset
    15
#include "sound_func.h"
8139
4e91c448c409 (svn r11701) -Codechange: removal unnecessary inclusions of map.h (and split map.h).
rubidium
parents: 8131
diff changeset
    16
#include "map_func.h"
8224
c5a64d87cc54 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8157
diff changeset
    17
#include "viewport_func.h"
c5a64d87cc54 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8157
diff changeset
    18
#include "gfx_func.h"
8398
1e181e2e4e15 (svn r11968) -Codechange: remove redundant FindLengthOfTunnel(), use GetTunnelBridgeLength() and/or GetOtherTunnelEnd() instead
smatz
parents: 8264
diff changeset
    19
#include "tunnelbridge.h"
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    20
#include "sortlist_type.h"
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
    21
#include "widgets/dropdown_func.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    22
8264
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8224
diff changeset
    23
#include "table/strings.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8224
diff changeset
    24
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    25
/**
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    26
 * Carriage for the data we need if we want to build a bridge
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    27
 */
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    28
struct BuildBridgeData {
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    29
	BridgeType index;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    30
	const BridgeSpec *spec;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    31
	Money cost;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    32
};
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    33
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    34
typedef GUIList<BuildBridgeData> GUIBridgeList;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    35
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    36
/**
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    37
 * Callback executed after a build Bridge CMD has been called
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    38
 *
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    39
 * @param scucess True if the build succeded
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    40
 * @param tile The tile where the command has been executed
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    41
 * @param p1 not used
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    42
 * @param p2 not used
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    43
 */
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1891
diff changeset
    44
void CcBuildBridge(bool success, TileIndex tile, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    45
{
541
625227bb2a3d (svn r925) Use sound enums
tron
parents: 534
diff changeset
    46
	if (success) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    47
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    48
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    49
/* Names of the build bridge selection window */
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    50
enum BuildBridgeSelectionWidgets {
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    51
	BBSW_CLOSEBOX = 0,
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    52
	BBSW_CAPTION,
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
    53
	BBSW_DROPDOWN_ORDER,
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
    54
	BBSW_DROPDOWN_CRITERIA,
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    55
	BBSW_BRIDGE_LIST,
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    56
	BBSW_SCROLLBAR,
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    57
	BBSW_RESIZEBOX
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    58
};
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    59
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    60
class BuildBridgeWindow : public Window {
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    61
private:
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    62
	/* Runtime saved values */
9568
ba4f22e6e3d9 (svn r13592) -Fix: window size remembering was broken
skidd13
parents: 9529
diff changeset
    63
	static uint16 last_size;
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    64
	static Listing last_sorting;
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
    65
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    66
	/* Constants for sorting the bridges */
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    67
	static const StringID sorter_names[];
9370
7e64238f2dbd (svn r13273) -Fix [FS#2042]: MSVC warnings (again)
glx
parents: 9367
diff changeset
    68
	static GUIBridgeList::SortFunction *const sorter_funcs[];
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    69
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    70
	/* Internal variables */
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    71
	TileIndex start_tile;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    72
	TileIndex end_tile;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    73
	uint32 type;
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
    74
	GUIBridgeList *bridges;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    75
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    76
	/** Sort the bridges by their index */
9376
afdc4beedc99 (svn r13280) -Fix (r13276): MSVC compilation was broken
smatz
parents: 9370
diff changeset
    77
	static int CDECL BridgeIndexSorter(const BuildBridgeData *a, const BuildBridgeData *b)
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    78
	{
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    79
		return a->index - b->index;
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    80
	}
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    81
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    82
	/** Sort the bridges by their price */
9376
afdc4beedc99 (svn r13280) -Fix (r13276): MSVC compilation was broken
smatz
parents: 9370
diff changeset
    83
	static int CDECL BridgePriceSorter(const BuildBridgeData *a, const BuildBridgeData *b)
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    84
	{
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    85
		return a->cost - b->cost;
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    86
	}
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    87
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    88
	/** Sort the bridges by their maximum speed */
9376
afdc4beedc99 (svn r13280) -Fix (r13276): MSVC compilation was broken
smatz
parents: 9370
diff changeset
    89
	static int CDECL BridgeSpeedSorter(const BuildBridgeData *a, const BuildBridgeData *b)
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    90
	{
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    91
		return a->spec->speed - b->spec->speed;
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    92
	}
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
    93
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    94
	void BuildBridge(uint8 i)
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    95
	{
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
    96
		DoCommandP(this->end_tile, this->start_tile, this->type | this->bridges->Get(i)->index,
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    97
				CcBuildBridge, CMD_BUILD_BRIDGE | CMD_MSG(STR_5015_CAN_T_BUILD_BRIDGE_HERE));
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
    98
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    99
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   100
	/** Sort the builable bridges */
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   101
	void SortBridgeList()
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   102
	{
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   103
		this->bridges->Sort();
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   104
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   105
		/* Display the current sort variant */
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   106
		this->widget[BBSW_DROPDOWN_CRITERIA].data = this->sorter_names[this->bridges->SortType()];
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   107
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   108
		/* Set the modified widgets dirty */
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   109
		this->InvalidateWidget(BBSW_DROPDOWN_CRITERIA);
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   110
		this->InvalidateWidget(BBSW_BRIDGE_LIST);
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   111
	}
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   112
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   113
public:
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   114
	BuildBridgeWindow(const WindowDesc *desc, TileIndex start, TileIndex end, uint32 br_type, GUIBridgeList *bl) : Window(desc),
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   115
		start_tile(start),
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   116
		end_tile(end),
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   117
		type(br_type),
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   118
		bridges(bl)
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   119
	{
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   120
		this->bridges->SetListing(this->last_sorting);
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   121
		this->bridges->SetSortFuncs(this->sorter_funcs);
9480
d3e94850ecdd (svn r13419) -Fix [FS#2063]: Entries in the bridge list were not sorted when the window was just opened.
rubidium
parents: 9376
diff changeset
   122
		this->bridges->NeedResort();
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   123
		this->SortBridgeList();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   124
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   125
		/* Change the data, or the caption of the gui. Set it to road or rail, accordingly */
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   126
		this->widget[BBSW_CAPTION].data = (GB(this->type, 15, 2) == TRANSPORT_ROAD) ? STR_1803_SELECT_ROAD_BRIDGE : STR_100D_SELECT_RAIL_BRIDGE;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   127
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   128
		this->resize.step_height = 22;
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   129
		this->vscroll.count = bl->Length();
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   130
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   131
		if (this->last_size <= 4) {
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   132
			this->vscroll.cap = 4;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   133
		} else {
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   134
			/* Resize the bridge selection window if we used a bigger one the last time */
9568
ba4f22e6e3d9 (svn r13592) -Fix: window size remembering was broken
skidd13
parents: 9529
diff changeset
   135
			this->vscroll.cap = min(this->last_size, this->vscroll.count);
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   136
			ResizeWindow(this, 0, (this->vscroll.cap - 4) * this->resize.step_height);
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   137
		}
6204
8cfc3aebfa3a (svn r8990) -Fix: more indenting and variable scoping
peter1138
parents: 6117
diff changeset
   138
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   139
		this->FindWindowPlacementAndResize(desc);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   140
	}
6204
8cfc3aebfa3a (svn r8990) -Fix: more indenting and variable scoping
peter1138
parents: 6117
diff changeset
   141
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   142
	~BuildBridgeWindow()
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   143
	{
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   144
		this->last_sorting = this->bridges->GetListing();
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   145
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   146
		delete bridges;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   147
	}
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   148
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   149
	virtual void OnPaint()
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   150
	{
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   151
		this->DrawWidgets();
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   152
9529
00028640ee3a (svn r13533) -Codechange: Replace direct class member access of GUIList with the appropriate function calls
skidd13
parents: 9480
diff changeset
   153
		this->DrawSortButtonState(BBSW_DROPDOWN_ORDER, this->bridges->IsDescSortOrder() ? SBS_DOWN : SBS_UP);
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   154
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   155
		uint y = this->widget[BBSW_BRIDGE_LIST].top + 2;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   156
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   157
		for (int i = this->vscroll.pos; (i < (this->vscroll.cap + this->vscroll.pos)) && (i < (int)this->bridges->Length()); i++) {
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   158
			const BridgeSpec *b = this->bridges->Get(i)->spec;
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   159
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   160
			SetDParam(2, this->bridges->Get(i)->cost);
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   161
			SetDParam(1, b->speed * 10 / 16);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   162
			SetDParam(0, b->material);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   163
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   164
			DrawSprite(b->sprite, b->pal, 3, y);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   165
			DrawString(44, y, STR_500D, TC_FROMSTRING);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   166
			y += this->resize.step_height;
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   167
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   168
		}
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   169
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 176
diff changeset
   170
9285
235e5e2d7f55 (svn r13151) -Codechange: use an enum instead of bool as return type of OnKeyPress/OnCTRLStateChange to make it obvious what the return values mean.
rubidium
parents: 9283
diff changeset
   171
	virtual EventState OnKeyPress(uint16 key, uint16 keycode)
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   172
	{
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   173
		const uint8 i = keycode - '1';
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   174
		if (i < 9 && i < this->bridges->Length()) {
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   175
			/* Build the requested bridge */
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   176
			this->BuildBridge(i);
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   177
			delete this;
9285
235e5e2d7f55 (svn r13151) -Codechange: use an enum instead of bool as return type of OnKeyPress/OnCTRLStateChange to make it obvious what the return values mean.
rubidium
parents: 9283
diff changeset
   178
			return ES_HANDLED;
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   179
		}
9285
235e5e2d7f55 (svn r13151) -Codechange: use an enum instead of bool as return type of OnKeyPress/OnCTRLStateChange to make it obvious what the return values mean.
rubidium
parents: 9283
diff changeset
   180
		return ES_NOT_HANDLED;
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   181
	}
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   182
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   183
	virtual void OnClick(Point pt, int widget)
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   184
	{
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   185
		switch (widget) {
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   186
			default: break;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   187
			case BBSW_BRIDGE_LIST: {
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   188
				uint i = ((int)pt.y - this->widget[BBSW_BRIDGE_LIST].top) / this->resize.step_height;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   189
				if (i < this->vscroll.cap) {
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   190
					i += this->vscroll.pos;
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   191
					if (i < this->bridges->Length()) {
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   192
						this->BuildBridge(i);
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   193
						delete this;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   194
					}
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   195
				}
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   196
			} break;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   197
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   198
			case BBSW_DROPDOWN_ORDER:
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   199
				this->bridges->ToggleSortOrder();
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   200
				this->SetDirty();
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   201
				break;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   202
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   203
			case BBSW_DROPDOWN_CRITERIA:
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   204
				ShowDropDownMenu(this, this->sorter_names, this->bridges->SortType(), BBSW_DROPDOWN_CRITERIA, 0, 0);
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   205
				break;
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   206
		}
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   207
	}
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   208
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   209
	virtual void OnDropdownSelect(int widget, int index)
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   210
	{
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   211
		if (widget == BBSW_DROPDOWN_CRITERIA && this->bridges->SortType() != index) {
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   212
			this->bridges->SetSortType(index);
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   213
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   214
			this->SortBridgeList();
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   215
		}
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   216
	}
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   217
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   218
	virtual void OnResize(Point new_size, Point delta)
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   219
	{
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   220
		this->vscroll.cap += delta.y / (int)this->resize.step_height;
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   221
		this->widget[BBSW_BRIDGE_LIST].data = (this->vscroll.cap << 8) + 1;
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   222
		SetVScrollCount(this, this->bridges->Length());
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
   223
9568
ba4f22e6e3d9 (svn r13592) -Fix: window size remembering was broken
skidd13
parents: 9529
diff changeset
   224
		this->last_size = max(this->vscroll.cap, this->last_size);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   225
	}
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   226
};
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   227
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   228
/* Set the default size of the Build Bridge Window */
9568
ba4f22e6e3d9 (svn r13592) -Fix: window size remembering was broken
skidd13
parents: 9529
diff changeset
   229
uint16 BuildBridgeWindow::last_size = 4;
9367
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   230
/* Set the default sorting for the bridges */
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   231
Listing BuildBridgeWindow::last_sorting = {false, 0};
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   232
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   233
/* Availible bridge sorting functions */
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   234
GUIBridgeList::SortFunction* const BuildBridgeWindow::sorter_funcs[] = {
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   235
	&BridgeIndexSorter,
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   236
	&BridgePriceSorter,
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   237
	&BridgeSpeedSorter
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   238
};
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   239
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   240
/* Names of the sorting functions */
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   241
const StringID BuildBridgeWindow::sorter_names[] = {
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   242
	STR_SORT_BY_NUMBER,
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   243
	STR_ENGINE_SORT_COST,
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   244
	STR_SORT_BY_MAX_SPEED,
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   245
	INVALID_STRING_ID
a643c88b2791 (svn r13269) -Codechange: build bridge window uses GUILists Sort() now
skidd13
parents: 9365
diff changeset
   246
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   247
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
   248
/* Widget definition for the rail bridge selection window */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   249
static const Widget _build_bridge_widgets[] = {
9743
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   250
{   WWT_CLOSEBOX,   RESIZE_NONE,  COLOUR_DARK_GREEN,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW},            // BBSW_CLOSEBOX
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   251
{    WWT_CAPTION,   RESIZE_NONE,  COLOUR_DARK_GREEN,  11, 199,   0,  13, STR_100D_SELECT_RAIL_BRIDGE, STR_018C_WINDOW_TITLE_DRAG_THIS},  // BBSW_CAPTION
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   252
9743
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   253
{    WWT_TEXTBTN,   RESIZE_NONE,  COLOUR_DARK_GREEN,   0,  80,  14,  25, STR_SORT_BY,                 STR_SORT_ORDER_TIP},               // BBSW_DROPDOWN_ORDER
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   254
{   WWT_DROPDOWN,   RESIZE_NONE,  COLOUR_DARK_GREEN,  81, 199,  14,  25, 0x0,                         STR_SORT_CRITERIA_TIP},            // BBSW_DROPDOWN_CRITERIA
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   255
9743
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   256
{     WWT_MATRIX, RESIZE_BOTTOM,  COLOUR_DARK_GREEN,   0, 187,  26, 113, 0x401,                       STR_101F_BRIDGE_SELECTION_CLICK},  // BBSW_BRIDGE_LIST
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   257
{  WWT_SCROLLBAR, RESIZE_BOTTOM,  COLOUR_DARK_GREEN, 188, 199,  26, 101, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST}, // BBSW_SCROLLBAR
d5786cbeb6f7 (svn r13876) -Codechange: Replace numbers with Colours enum on bridge gui
belugas
parents: 9568
diff changeset
   258
{  WWT_RESIZEBOX,     RESIZE_TB,  COLOUR_DARK_GREEN, 188, 199, 102, 113, 0x0,                         STR_RESIZE_BUTTON},                // BBSW_RESIZEBOX
176
84990c4b9212 (svn r177) -Fix: padded out Widget code to solve warnings on C99 compiler (Tron)
darkvater
parents: 0
diff changeset
   259
{   WIDGETS_END},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   260
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   261
8020
ba100ceda5b4 (svn r11580) -Feature: Memorise the resizing of the build bridge selection window during runtime
skidd13
parents: 7983
diff changeset
   262
/* Window definition for the rail bridge selection window */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   263
static const WindowDesc _build_bridge_desc = {
9292
176fb6c36f10 (svn r13159) -Feature: Add the ability to sort availible bridges in the build bridge GUI
skidd13
parents: 9285
diff changeset
   264
	WDP_AUTO, WDP_AUTO, 200, 114, 200, 114,
5070
7f5b13b7e728 (svn r7128) -Codechange: Replace magic numbers by magic enums (windowdesc positioning WDP_AUTO = -1)
Darkvater
parents: 4634
diff changeset
   265
	WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   266
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   267
	_build_bridge_widgets,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   268
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   269
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   270
/**
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   271
 * Prepare the data for the build a bridge window.
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   272
 *  If we can't build a bridge under the given conditions
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   273
 *  show an error message.
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   274
 *
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   275
 * @parma start The start tile of the bridge
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   276
 * @param end The end tile of the bridge
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   277
 * @param transport_type The transport type
10140
5c9f3aea73a5 (svn r14326) -Fix: some wrong comments (Yexo)
rubidium
parents: 9743
diff changeset
   278
 * @param road_rail_type The road/rail type
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   279
 */
10140
5c9f3aea73a5 (svn r14326) -Fix: some wrong comments (Yexo)
rubidium
parents: 9743
diff changeset
   280
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte road_rail_type)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   281
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   282
	DeleteWindowById(WC_BUILD_BRIDGE, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   283
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   284
	/* Data type for the bridge.
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   285
	 * Bit 16,15 = transport type,
10140
5c9f3aea73a5 (svn r14326) -Fix: some wrong comments (Yexo)
rubidium
parents: 9743
diff changeset
   286
	 *     14..8 = road/rail types,
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   287
	 *      7..0 = type of bridge */
10140
5c9f3aea73a5 (svn r14326) -Fix: some wrong comments (Yexo)
rubidium
parents: 9743
diff changeset
   288
	uint32 type = (transport_type << 15) | (road_rail_type << 8);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   289
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   290
	/* only query bridge building possibility once, result is the same for all bridges!
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   291
	 * returns CMD_ERROR on failure, and price on success */
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   292
	StringID errmsg = INVALID_STRING_ID;
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   293
	CommandCost ret = DoCommand(end, start, type, DC_AUTO | DC_QUERY_COST, CMD_BUILD_BRIDGE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   294
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   295
	GUIBridgeList *bl = NULL;
2737
fb1556b8f5e0 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2639
diff changeset
   296
	if (CmdFailed(ret)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   297
		errmsg = _error_message;
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2470
diff changeset
   298
	} else {
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   299
		/* check which bridges can be built
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   300
		 * get absolute bridge length
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   301
		 * length of the middle parts of the bridge */
8398
1e181e2e4e15 (svn r11968) -Codechange: remove redundant FindLengthOfTunnel(), use GetTunnelBridgeLength() and/or GetOtherTunnelEnd() instead
smatz
parents: 8264
diff changeset
   302
		const uint bridge_len = GetTunnelBridgeLength(start, end);
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   303
		/* total length of bridge */
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   304
		const uint tot_bridgedata_len = CalcBridgeLenCostFactor(bridge_len + 2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   305
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   306
		bl = new GUIBridgeList();
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   307
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   308
		/* loop for all bridgetypes */
8532
ebe68d6899b6 (svn r12107) -Codechange: Add and use the typedef BridgeType
belugas
parents: 8491
diff changeset
   309
		for (BridgeType brd_type = 0; brd_type != MAX_BRIDGES; brd_type++) {
ebe68d6899b6 (svn r12107) -Codechange: Add and use the typedef BridgeType
belugas
parents: 8491
diff changeset
   310
			if (CheckBridge_Stuff(brd_type, bridge_len)) {
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   311
				/* bridge is accepted, add to list */
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   312
				BuildBridgeData *item = bl->Append();
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   313
				item->index = brd_type;
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   314
				item->spec = GetBridgeSpec(brd_type);
7983
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   315
				/* Add to terraforming & bulldozing costs the cost of the
3b1fec9d5e31 (svn r11539) -Feature: Make the bridge selection window resizable
skidd13
parents: 7824
diff changeset
   316
				 * bridge itself (not computed with DC_QUERY_COST) */
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   317
				item->cost = ret.GetCost() + (((int64)tot_bridgedata_len * _price.build_bridge * item->spec->price) >> 8);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   318
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   320
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   321
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   322
	if (bl != NULL && bl->Length() != 0) {
9283
dbccc281c38a (svn r13149) -Codechange: make a class of the BuildBridgeWindow.
skidd13
parents: 9273
diff changeset
   323
		new BuildBridgeWindow(&_build_bridge_desc, start, end, type, bl);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   324
	} else {
9365
95e9cbc0257e (svn r13266) -Codechange: Use SmallVector in GUIList
peter1138
parents: 9320
diff changeset
   325
		if (bl != NULL) delete bl;
3422
a6eba3443452 (svn r4249) -Codechange: Replace more occurences of 16 by TILE_SIZE and of 8 by TILE_HEIGHT. Reverted one change from the previous commit because it was faulty
celestar
parents: 2952
diff changeset
   326
		ShowErrorMessage(errmsg, STR_5015_CAN_T_BUILD_BRIDGE_HERE, TileX(end) * TILE_SIZE, TileY(end) * TILE_SIZE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   327
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   328
}