src/newgrf_gui.cpp
author terom@terom-desktop
Thu, 24 Jul 2008 16:18:29 +0300
changeset 11185 5036deb1fcaf
parent 11180 982e9f814f97
permissions -rw-r--r--
fix check_available_write_cb buffer-growing logic
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     1
/* $Id$ */
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     2
10429
1b99254f9607 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 9245
diff changeset
     3
/** @file newgrf_gui.cpp GUI to change NewGRF settings. */
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
     4
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     5
#include "stdafx.h"
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     6
#include "openttd.h"
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     7
#include "variables.h"
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
     8
#include "gui.h"
8603
88c5ce6a5215 (svn r11668) -Codechange: more refactoring aimed at reducing compile time and making it more logic where function definitions can be found.
rubidium
parents: 8602
diff changeset
     9
#include "window_gui.h"
88c5ce6a5215 (svn r11668) -Codechange: more refactoring aimed at reducing compile time and making it more logic where function definitions can be found.
rubidium
parents: 8602
diff changeset
    10
#include "textbuf_gui.h"
5352
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
    11
#include "newgrf.h"
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    12
#include "newgrf_config.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8603
diff changeset
    13
#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: 8626
diff changeset
    14
#include "window_func.h"
8709
4187ad809fe7 (svn r11776) -Codechange: more header splittings to reduce the dependencies.
rubidium
parents: 8627
diff changeset
    15
#include "core/alloc_func.hpp"
8710
52015340050c (svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents: 8709
diff changeset
    16
#include "string_func.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8710
diff changeset
    17
#include "gfx_func.h"
10824
1a34ba6f338a (svn r13375) -Add: logging of actions that could possibly cause desyncs and crashes to simplify debugging. See readme.txt for details
smatz
parents: 10641
diff changeset
    18
#include "gamelog.h"
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    19
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8720
diff changeset
    20
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8720
diff changeset
    21
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8720
diff changeset
    22
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    23
/** Parse an integerlist string and set each found value
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    24
 * @param p the string to be parsed. Each element in the list is seperated by a
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    25
 * comma or a space character
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    26
 * @param items pointer to the integerlist-array that will be filled with values
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    27
 * @param maxitems the maximum number of elements the integerlist-array has
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    28
 * @return returns the number of items found, or -1 on an error */
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    29
static int parse_intlist(const char *p, int *items, int maxitems)
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    30
{
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    31
	int n = 0, v;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    32
	char *end;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    33
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    34
	for (;;) {
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    35
		v = strtol(p, &end, 0);
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    36
		if (p == end || n == maxitems) return -1;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    37
		p = end;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    38
		items[n++] = v;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    39
		if (*p == '\0') break;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    40
		if (*p != ',' && *p != ' ') return -1;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    41
		p++;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    42
	}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    43
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    44
	return n;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    45
}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    46
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    47
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
    48
static void ShowNewGRFInfo(const GRFConfig *c, uint x, uint y, uint w, uint bottom, bool show_params)
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    49
{
5885
262234e81333 (svn r8093) -Codechange: Add a function to get a string representation of an MD5SUM and use it.
Darkvater
parents: 5860
diff changeset
    50
	char buff[256];
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    51
6429
02c062eb2c74 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6144
diff changeset
    52
	if (c->error != NULL) {
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    53
		char message[512];
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    54
		if (c->error->custom_message == NULL) {
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    55
			SetDParamStr(0, c->filename);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    56
			SetDParamStr(1, c->error->data);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    57
			for (uint i = 0; i < c->error->num_params; i++) {
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    58
				uint32 param = 0;
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    59
				byte param_number = c->error->param_number[i];
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6429
diff changeset
    60
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    61
				if (param_number < c->num_params) param = c->param[param_number];
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6429
diff changeset
    62
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    63
				SetDParam(2 + i, param);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    64
			}
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    65
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    66
			GetString(message, c->error->message, lastof(message));
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    67
		} else {
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    68
			SetDParamStr(0, c->error->custom_message);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    69
			GetString(message, STR_JUST_RAW_STRING, lastof(message));
6465
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6429
diff changeset
    70
		}
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6429
diff changeset
    71
dddb39b41ee0 (svn r8881) -Feature: Allow built-in newgrf error messages to be translated, and load custom error messages properly.
maedhros
parents: 6429
diff changeset
    72
		SetDParamStr(0, message);
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
    73
		y += DrawStringMultiLine(x, y, c->error->severity, w, bottom - y);
6429
02c062eb2c74 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6144
diff changeset
    74
	}
02c062eb2c74 (svn r8838) -Feature: Show newgrf error messages loaded in Action B in the newgrf gui
maedhros
parents: 6144
diff changeset
    75
5339
7573f179efe8 (svn r7505) -Feature: show NewGRFs used on a game server, show which NewGRFs you do and do not have.
rubidium
parents: 5329
diff changeset
    76
	/* Draw filename or not if it is not known (GRF sent over internet) */
7573f179efe8 (svn r7505) -Feature: show NewGRFs used on a game server, show which NewGRFs you do and do not have.
rubidium
parents: 5329
diff changeset
    77
	if (c->filename != NULL) {
7573f179efe8 (svn r7505) -Feature: show NewGRFs used on a game server, show which NewGRFs you do and do not have.
rubidium
parents: 5329
diff changeset
    78
		SetDParamStr(0, c->filename);
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
    79
		y += DrawStringMultiLine(x, y, STR_NEWGRF_FILENAME, w, bottom - y);
5339
7573f179efe8 (svn r7505) -Feature: show NewGRFs used on a game server, show which NewGRFs you do and do not have.
rubidium
parents: 5329
diff changeset
    80
	}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    81
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    82
	/* Prepare and draw GRF ID */
5894
eb5ff472c10f (svn r8102) -Cleanup: Remove unreachable code (r8096), useless cast
Darkvater
parents: 5889
diff changeset
    83
	snprintf(buff, lengthof(buff), "%08X", BSWAP32(c->grfid));
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    84
	SetDParamStr(0, buff);
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
    85
	y += DrawStringMultiLine(x, y, STR_NEWGRF_GRF_ID, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    86
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    87
	/* Prepare and draw MD5 sum */
5885
262234e81333 (svn r8093) -Codechange: Add a function to get a string representation of an MD5SUM and use it.
Darkvater
parents: 5860
diff changeset
    88
	md5sumToString(buff, lastof(buff), c->md5sum);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    89
	SetDParamStr(0, buff);
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
    90
	y += DrawStringMultiLine(x, y, STR_NEWGRF_MD5SUM, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    91
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    92
	/* Show GRF parameter list */
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    93
	if (show_params) {
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    94
		if (c->num_params > 0) {
5308
bad31e174cc6 (svn r7464) -Codechange: move BuildParamList from newgrf_gui to newgrf_config and
peter1138
parents: 5248
diff changeset
    95
			GRFBuildParamList(buff, c, lastof(buff));
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    96
			SetDParam(0, STR_JUST_RAW_STRING);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
    97
			SetDParamStr(1, buff);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    98
		} else {
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
    99
			SetDParam(0, STR_01A9_NONE);
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   100
		}
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
   101
		y += DrawStringMultiLine(x, y, STR_NEWGRF_PARAMETER, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   102
	}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   103
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   104
	/* Show flags */
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
   105
	if (c->status == GCS_NOT_FOUND)        y += DrawStringMultiLine(x, y, STR_NEWGRF_NOT_FOUND, w, bottom - y);
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
   106
	if (c->status == GCS_DISABLED)         y += DrawStringMultiLine(x, y, STR_NEWGRF_DISABLED, w, bottom - y);
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8378
diff changeset
   107
	if (HasBit(c->flags, GCF_COMPATIBLE)) y += DrawStringMultiLine(x, y, STR_NEWGRF_COMPATIBLE_LOADED, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   108
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   109
	/* Draw GRF info if it exists */
5889
272800d151ac (svn r8097) Replace strlen() {==,!=,>} 0 by the more concise {,!}StrEmpty(). Additionally the test takes O(1) instead of O(n) now
tron
parents: 5886
diff changeset
   110
	if (c->info != NULL && !StrEmpty(c->info)) {
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
   111
		SetDParam(0, STR_JUST_RAW_STRING);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
   112
		SetDParamStr(1, c->info);
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
   113
		y += DrawStringMultiLine(x, y, STR_02BD, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   114
	} else {
6703
9ddfcb1849e4 (svn r9449) -Fix: Truncate the newgrf information text in the newgrf gui if it's too long.
maedhros
parents: 6674
diff changeset
   115
		y += DrawStringMultiLine(x, y, STR_NEWGRF_NO_INFO, w, bottom - y);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   116
	}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   117
}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   118
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   119
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   120
/**
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   121
 * Window for adding NewGRF files
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   122
 */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   123
struct NewGRFAddWindow : public Window {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   124
	/* Names of the add a newgrf window widgets */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   125
	enum AddNewGRFWindowWidgets {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   126
		ANGRFW_CLOSEBOX = 0,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   127
		ANGRFW_CAPTION,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   128
		ANGRFW_BACKGROUND,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   129
		ANGRFW_GRF_LIST,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   130
		ANGRFW_SCROLLBAR,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   131
		ANGRFW_GRF_INFO,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   132
		ANGRFW_ADD,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   133
		ANGRFW_RESCAN,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   134
		ANGRFW_RESIZE,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   135
	};
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   136
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   137
	GRFConfig **list;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   138
	const GRFConfig *sel;
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   139
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   140
	NewGRFAddWindow(const WindowDesc *desc, GRFConfig **list) : Window(desc, 0)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   141
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   142
		this->list = list;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   143
		this->resize.step_height = 10;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   144
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   145
		this->FindWindowPlacementAndResize(desc);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   146
	}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   147
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   148
	virtual void OnPaint()
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   149
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   150
		const GRFConfig *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   151
		const Widget *wl = &this->widget[ANGRFW_GRF_LIST];
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   152
		int n = 0;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   153
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   154
		/* Count the number of GRFs */
11180
982e9f814f97 scan for tarfiles in CACHE_DIR, remember what Subdirectory a tar was found in, set the GCF_FLAG on GRFs loaded from there, and hide those in the NewGRF GUI
Tero Marttila <terom@fixme.fi>
parents: 11157
diff changeset
   155
		for (c = _all_grfs; c != NULL; c = c->next) 
982e9f814f97 scan for tarfiles in CACHE_DIR, remember what Subdirectory a tar was found in, set the GCF_FLAG on GRFs loaded from there, and hide those in the NewGRF GUI
Tero Marttila <terom@fixme.fi>
parents: 11157
diff changeset
   156
            if (!HasBit(c->flags, GCF_CACHE))
982e9f814f97 scan for tarfiles in CACHE_DIR, remember what Subdirectory a tar was found in, set the GCF_FLAG on GRFs loaded from there, and hide those in the NewGRF GUI
Tero Marttila <terom@fixme.fi>
parents: 11157
diff changeset
   157
                n++;
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   158
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   159
		this->vscroll.cap = (wl->bottom - wl->top) / 10;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   160
		SetVScrollCount(this, n);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   161
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   162
		this->SetWidgetDisabledState(ANGRFW_ADD, this->sel == NULL || this->sel->IsOpenTTDBaseGRF());
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10529
diff changeset
   163
		this->DrawWidgets();
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   164
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   165
		GfxFillRect(wl->left + 1, wl->top + 1, wl->right, wl->bottom, 0xD7);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   166
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   167
		uint y = wl->top + 1;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   168
		for (c = _all_grfs, n = 0; c != NULL && n < (this->vscroll.pos + this->vscroll.cap); c = c->next, n++) {
11180
982e9f814f97 scan for tarfiles in CACHE_DIR, remember what Subdirectory a tar was found in, set the GCF_FLAG on GRFs loaded from there, and hide those in the NewGRF GUI
Tero Marttila <terom@fixme.fi>
parents: 11157
diff changeset
   169
			if (!HasBit(c->flags, GCF_CACHE) && n >= this->vscroll.pos) {
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   170
				bool h = c == this->sel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   171
				const char *text = (c->name != NULL && !StrEmpty(c->name)) ? c->name : c->filename;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   172
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   173
				/* Draw selection background */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   174
				if (h) GfxFillRect(3, y, this->width - 15, y + 9, 156);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   175
				DoDrawStringTruncated(text, 4, y, h ? TC_WHITE : TC_ORANGE, this->width - 18);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   176
				y += 10;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   177
			}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   178
		}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   179
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   180
		if (this->sel != NULL) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   181
			const Widget *wi = &this->widget[ANGRFW_GRF_INFO];
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   182
			ShowNewGRFInfo(this->sel, wi->left + 2, wi->top + 2, wi->right - wi->left - 2, wi->bottom, false);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   183
		}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   184
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   185
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   186
	virtual void OnDoubleClick(Point pt, int widget)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   187
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   188
		if (widget == ANGRFW_GRF_LIST) this->OnClick(pt, ANGRFW_ADD);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   189
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   190
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   191
	virtual void OnClick(Point pt, int widget)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   192
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   193
		switch (widget) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   194
			case ANGRFW_GRF_LIST: {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   195
				/* Get row... */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   196
				const GRFConfig *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   197
				uint i = (pt.y - this->widget[ANGRFW_GRF_LIST].top) / 10 + this->vscroll.pos;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   198
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   199
				for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--) {}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   200
				this->sel = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   201
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   202
				break;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   203
			}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   204
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   205
			case ANGRFW_ADD: // Add selection to list
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   206
				if (this->sel != NULL) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   207
					const GRFConfig *src = this->sel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   208
					GRFConfig **list;
5243
a564347a939b (svn r7367) -Codechange: prevent adding files where the GRF ID is already in the list
peter1138
parents: 5241
diff changeset
   209
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   210
					/* Find last entry in the list, checking for duplicate grfid on the way */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   211
					for (list = this->list; *list != NULL; list = &(*list)->next) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   212
						if ((*list)->grfid == src->grfid) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   213
							ShowErrorMessage(INVALID_STRING_ID, STR_NEWGRF_DUPLICATE_GRFID, 0, 0);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   214
							return;
5243
a564347a939b (svn r7367) -Codechange: prevent adding files where the GRF ID is already in the list
peter1138
parents: 5241
diff changeset
   215
						}
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   216
					}
5243
a564347a939b (svn r7367) -Codechange: prevent adding files where the GRF ID is already in the list
peter1138
parents: 5241
diff changeset
   217
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   218
					/* Copy GRF details from scanned list */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   219
					GRFConfig *c = CallocT<GRFConfig>(1);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   220
					*c = *src;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   221
					c->filename = strdup(src->filename);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   222
					if (src->name      != NULL) c->name      = strdup(src->name);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   223
					if (src->info      != NULL) c->info      = strdup(src->info);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   224
					c->next = NULL;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   225
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   226
					/* Append GRF config to configuration list */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   227
					*list = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   228
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   229
					DeleteWindowByClass(WC_SAVELOAD);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   230
					InvalidateWindowData(WC_GAME_OPTIONS, 0);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   231
				}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   232
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   233
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   234
			case ANGRFW_RESCAN: // Rescan list
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   235
				this->sel = NULL;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   236
				ScanNewGRFFiles();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   237
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   238
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   239
		}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   240
	}
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   241
};
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   242
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   243
/* Widget definition for the add a newgrf window */
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   244
static const Widget _newgrf_add_dlg_widgets[] = {
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   245
{   WWT_CLOSEBOX,    RESIZE_NONE, 14,   0,  10,   0,  13, STR_00C5,                STR_018B_CLOSE_WINDOW },           // ANGRFW_CLOSEBOX
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   246
{    WWT_CAPTION,   RESIZE_RIGHT, 14,  11, 306,   0,  13, STR_NEWGRF_ADD_CAPTION,  STR_018C_WINDOW_TITLE_DRAG_THIS }, // ANGRFW_CAPTION
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   247
{      WWT_PANEL,      RESIZE_RB, 14,   0, 294,  14, 121, 0x0,                     STR_NULL },                        // ANGRFW_BACKGROUND
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   248
{      WWT_INSET,      RESIZE_RB, 14,   2, 292,  16, 119, 0x0,                     STR_NULL },                        // ANGRFW_GRF_LIST
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   249
{  WWT_SCROLLBAR,     RESIZE_LRB, 14, 295, 306,  14, 121, 0x0,                     STR_NULL },                        // ANGRFW_SCROLLBAR
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   250
{      WWT_PANEL,     RESIZE_RTB, 14,   0, 306, 122, 224, 0x0,                     STR_NULL },                        // ANGRFW_GRF_INFO
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   251
{ WWT_PUSHTXTBTN,     RESIZE_RTB, 14,   0, 146, 225, 236, STR_NEWGRF_ADD_FILE,     STR_NEWGRF_ADD_FILE_TIP },         // ANGRFW_ADD
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   252
{ WWT_PUSHTXTBTN,    RESIZE_LRTB, 14, 147, 294, 225, 236, STR_NEWGRF_RESCAN_FILES, STR_NEWGRF_RESCAN_FILES_TIP },     // ANGRFW_RESCAN
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   253
{  WWT_RESIZEBOX,    RESIZE_LRTB, 14, 295, 306, 225, 236, 0x0,                     STR_RESIZE_BUTTON },               // ANGRFW_RESIZE
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   254
{   WIDGETS_END },
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   255
};
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   256
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   257
/* Window definition for the add a newgrf window */
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   258
static const WindowDesc _newgrf_add_dlg_desc = {
7837
65d7362153a6 (svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents: 7530
diff changeset
   259
	WDP_CENTER, WDP_CENTER, 307, 237, 307, 337,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 5919
diff changeset
   260
	WC_SAVELOAD, WC_NONE,
8515
d0401d967e99 (svn r11579) -Revert(r11578): some cases of key propagation are not handled correctly.
belugas
parents: 8514
diff changeset
   261
	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   262
	_newgrf_add_dlg_widgets,
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   263
};
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   264
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   265
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   266
static void NewGRFConfirmationCallback(Window *w, bool confirmed);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   267
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   268
/**
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   269
 * Window for showing NewGRF files
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   270
 */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   271
struct NewGRFWindow : public Window {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   272
	/* Names of the manage newgrfs window widgets */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   273
	enum ShowNewGRFStateWidgets {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   274
		SNGRFS_CLOSEBOX = 0,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   275
		SNGRFS_CAPTION,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   276
		SNGRFS_BACKGROUND,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   277
		SNGRFS_ADD,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   278
		SNGRFS_REMOVE,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   279
		SNGRFS_MOVE_UP,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   280
		SNGRFS_MOVE_DOWN,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   281
		SNGRFS_FILE_LIST,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   282
		SNGRFS_SCROLLBAR,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   283
		SNGRFS_NEWGRF_INFO,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   284
		SNGRFS_SET_PARAMETERS,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   285
		SNGRFS_APPLY_CHANGES,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   286
		SNGRFS_RESIZE,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   287
	};
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   288
5352
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   289
	GRFConfig **orig_list; ///< grf list the window is shown with
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   290
	GRFConfig *list;       ///< temporary grf list to which changes are made
5352
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   291
	GRFConfig *sel;        ///< selected grf item
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   292
	bool editable;         ///< is the window editable
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   293
	bool show_params;      ///< are the grf-parameters shown in the info-panel
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   294
	bool execute;          ///< on pressing 'apply changes' are grf changes applied immediately, or only list is updated
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   295
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   296
	NewGRFWindow(const WindowDesc *desc, bool editable, bool show_params, bool exec_changes, GRFConfig **config) : Window(desc, 0)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   297
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   298
		this->resize.step_height = 14;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   299
		this->sel         = NULL;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   300
		this->list        = NULL;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   301
		this->orig_list   = config;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   302
		this->editable    = editable;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   303
		this->execute     = exec_changes;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   304
		this->show_params = show_params;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   305
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   306
		CopyGRFConfigList(&this->list, *config, false);
6555
c27c9d5b459f (svn r9031) -Codechange: Introduce grfconfig->status, and use it for states that are
maedhros
parents: 6492
diff changeset
   307
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   308
		this->FindWindowPlacementAndResize(desc);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   309
		this->SetupNewGRFWindow();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   310
	}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   311
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   312
	~NewGRFWindow()
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   313
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   314
		if (!this->execute) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   315
			CopyGRFConfigList(this->orig_list, this->list, true);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   316
			ResetGRFConfig(false);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   317
			ReloadNewGRFData();
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   318
		}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   319
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   320
		/* Remove the temporary copy of grf-list used in window */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   321
		ClearGRFConfigList(&this->list);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   322
	}
5248
2aa0c4cc8f23 (svn r7373) -Codechange: when removing a GRF from the list, make the next one selected, or the previous file if the last item is being removed. This makes clearing the list easier.
peter1138
parents: 5243
diff changeset
   323
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   324
	void SetupNewGRFWindow()
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   325
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   326
		const GRFConfig *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   327
		int i;
5248
2aa0c4cc8f23 (svn r7373) -Codechange: when removing a GRF from the list, make the next one selected, or the previous file if the last item is being removed. This makes clearing the list easier.
peter1138
parents: 5243
diff changeset
   328
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   329
		for (c = this->list, i = 0; c != NULL; c = c->next, i++) {}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   330
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   331
		this->vscroll.cap = (this->widget[SNGRFS_FILE_LIST].bottom - this->widget[SNGRFS_FILE_LIST].top) / 14 + 1;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   332
		SetVScrollCount(this, i);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   333
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   334
		this->SetWidgetDisabledState(SNGRFS_ADD, !this->editable);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   335
		this->SetWidgetDisabledState(SNGRFS_APPLY_CHANGES, !this->editable);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   336
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   337
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   338
	virtual void OnPaint()
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   339
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   340
		bool disable_all = this->sel == NULL || !this->editable;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   341
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   342
		this->SetWidgetsDisabledState(disable_all,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   343
			SNGRFS_REMOVE,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   344
			SNGRFS_MOVE_UP,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   345
			SNGRFS_MOVE_DOWN,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   346
			WIDGET_LIST_END
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   347
		);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   348
		this->SetWidgetDisabledState(SNGRFS_SET_PARAMETERS, !this->show_params || disable_all);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   349
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   350
		if (!disable_all) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   351
			/* All widgets are now enabled, so disable widgets we can't use */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   352
			if (this->sel == this->list)       this->DisableWidget(SNGRFS_MOVE_UP);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   353
			if (this->sel->next == NULL)       this->DisableWidget(SNGRFS_MOVE_DOWN);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   354
			if (this->sel->IsOpenTTDBaseGRF()) this->DisableWidget(SNGRFS_REMOVE);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   355
		}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   356
10595
7957c71b0dfe (svn r13139) -Codechange: move DrawWindowWidgets and DrawWindowViewport to the Window class and remove Window from their naming.
rubidium
parents: 10529
diff changeset
   357
		this->DrawWidgets();
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   358
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   359
		/* Draw NewGRF list */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   360
		int y = this->widget[SNGRFS_FILE_LIST].top;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   361
		int i = 0;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   362
		for (const GRFConfig *c = this->list; c != NULL; c = c->next, i++) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   363
			if (i >= this->vscroll.pos && i < this->vscroll.pos + this->vscroll.cap) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   364
				const char *text = (c->name != NULL && !StrEmpty(c->name)) ? c->name : c->filename;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   365
				SpriteID pal;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   366
				byte txtoffset;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   367
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   368
				/* Pick a colour */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   369
				switch (c->status) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   370
					case GCS_NOT_FOUND:
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   371
					case GCS_DISABLED:
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   372
						pal = PALETTE_TO_RED;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   373
						break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   374
					case GCS_ACTIVATED:
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   375
						pal = PALETTE_TO_GREEN;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   376
						break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   377
					default:
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   378
						pal = PALETTE_TO_BLUE;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   379
						break;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   380
				}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   381
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   382
				/* Do not show a "not-failure" colour when it actually failed to load */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   383
				if (pal != PALETTE_TO_RED) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   384
					if (HasBit(c->flags, GCF_STATIC)) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   385
						pal = PALETTE_TO_GREY;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   386
					} else if (HasBit(c->flags, GCF_COMPATIBLE)) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   387
						pal = PALETTE_TO_ORANGE;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   388
					}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   389
				}
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   390
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   391
				DrawSprite(SPR_SQUARE, pal, 5, y + 2);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   392
				if (c->error != NULL) DrawSprite(SPR_WARNING_SIGN, 0, 20, y + 2);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   393
				txtoffset = c->error != NULL ? 35 : 25;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   394
				DoDrawStringTruncated(text, txtoffset, y + 3, this->sel == c ? TC_WHITE : TC_BLACK, this->width - txtoffset - 10);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   395
				y += 14;
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   396
			}
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   397
		}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   398
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   399
		if (this->sel != NULL) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   400
			/* Draw NewGRF file info */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   401
			const Widget *wi = &this->widget[SNGRFS_NEWGRF_INFO];
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   402
			ShowNewGRFInfo(this->sel, wi->left + 2, wi->top + 2, wi->right - wi->left - 2, wi->bottom, this->show_params);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   403
		}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   404
	}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   405
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   406
	virtual void OnClick(Point pt, int widget)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   407
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   408
		switch (widget) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   409
			case SNGRFS_ADD: // Add GRF
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   410
				DeleteWindowByClass(WC_SAVELOAD);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   411
				new NewGRFAddWindow(&_newgrf_add_dlg_desc, &this->list);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   412
				break;
5352
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   413
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   414
			case SNGRFS_REMOVE: { // Remove GRF
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   415
				GRFConfig **pc, *c, *newsel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   416
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   417
				/* Choose the next GRF file to be the selected file */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   418
				newsel = this->sel->next;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   419
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   420
				for (pc = &this->list; (c = *pc) != NULL; pc = &c->next) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   421
					/* If the new selection is empty (i.e. we're deleting the last item
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   422
					 * in the list, pick the file just before the selected file */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   423
					if (newsel == NULL && c->next == this->sel) newsel = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   424
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   425
					if (c == this->sel) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   426
						*pc = c->next;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   427
						free(c);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   428
						break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   429
					}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   430
				}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   431
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   432
				this->sel = newsel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   433
				this->SetupNewGRFWindow();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   434
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   435
				break;
9087
c6ff1721bb00 (svn r12172) -Codechange: Allow buttons to resize in NewGRF settings window
peter1138
parents: 8760
diff changeset
   436
			}
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   437
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   438
			case SNGRFS_MOVE_UP: { // Move GRF up
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   439
				GRFConfig **pc, *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   440
				if (this->sel == NULL) break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   441
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   442
				for (pc = &this->list; (c = *pc) != NULL; pc = &c->next) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   443
					if (c->next == this->sel) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   444
						c->next = this->sel->next;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   445
						this->sel->next = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   446
						*pc = this->sel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   447
						break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   448
					}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   449
				}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   450
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   451
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   452
			}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   453
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   454
			case SNGRFS_MOVE_DOWN: { // Move GRF down
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   455
				GRFConfig **pc, *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   456
				if (this->sel == NULL) break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   457
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   458
				for (pc = &this->list; (c = *pc) != NULL; pc = &c->next) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   459
					if (c == this->sel) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   460
						*pc = c->next;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   461
						c->next = c->next->next;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   462
						(*pc)->next = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   463
						break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   464
					}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   465
				}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   466
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   467
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   468
			}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   469
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   470
			case SNGRFS_FILE_LIST: { // Select a GRF
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   471
				GRFConfig *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   472
				uint i = (pt.y - this->widget[SNGRFS_FILE_LIST].top) / 14 + this->vscroll.pos;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   473
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   474
				for (c = this->list; c != NULL && i > 0; c = c->next, i--) {}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   475
				this->sel = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   476
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   477
				this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   478
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   479
			}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   480
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   481
			case SNGRFS_APPLY_CHANGES: // Apply changes made to GRF list
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   482
				if (this->execute) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   483
					ShowQuery(
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   484
						STR_POPUP_CAUTION_CAPTION,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   485
						STR_NEWGRF_CONFIRMATION_TEXT,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   486
						this,
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   487
						NewGRFConfirmationCallback
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   488
					);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   489
				} else {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   490
					CopyGRFConfigList(this->orig_list, this->list, true);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   491
					ResetGRFConfig(false);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   492
					ReloadNewGRFData();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   493
				}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   494
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   495
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   496
			case SNGRFS_SET_PARAMETERS: { // Edit parameters
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   497
				if (this->sel == NULL) break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   498
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
   499
				static char buff[512];
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   500
				GRFBuildParamList(buff, this->sel, lastof(buff));
11157
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
   501
				SetDParamStr(0, buff);
a0173588b15e (svn r13715) -Fix [FS#2129]: C-like strings had to be rebound each time they were printed, otherwise the text could change due to the few number of slots that could be used to bind.
rubidium
parents: 10824
diff changeset
   502
				ShowQueryString(STR_JUST_RAW_STRING, STR_NEWGRF_PARAMETER_QUERY, 63, 250, this, CS_ALPHANUMERAL);
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   503
				break;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   504
			}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   505
		}
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   506
	}
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   507
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   508
	virtual void OnQueryTextFinished(char *str)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   509
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   510
		if (str == NULL) return;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   511
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   512
		/* Parse our new "int list" */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   513
		GRFConfig *c = this->sel;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   514
		c->num_params = parse_intlist(str, (int*)c->param, lengthof(c->param));
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   515
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   516
		/* parse_intlist returns -1 on error */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   517
		if (c->num_params == (byte)-1) c->num_params = 0;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   518
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   519
		this->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   520
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   521
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   522
	virtual void OnResize(Point new_size, Point delta)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   523
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   524
		if (delta.x != 0) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   525
			ResizeButtons(this, SNGRFS_ADD, SNGRFS_MOVE_DOWN);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   526
			ResizeButtons(this, SNGRFS_SET_PARAMETERS, SNGRFS_APPLY_CHANGES);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   527
		}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   528
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   529
		this->vscroll.cap += delta.y / 14;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   530
		this->widget[SNGRFS_FILE_LIST].data = (this->vscroll.cap << 8) + 1;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   531
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   532
		this->SetupNewGRFWindow();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   533
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   534
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   535
	virtual void OnInvalidateData(int data = 0)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   536
	{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   537
		this->SetupNewGRFWindow();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   538
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   539
};
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   540
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   541
/* Widget definition of the manage newgrfs window */
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   542
static const Widget _newgrf_widgets[] = {
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   543
{   WWT_CLOSEBOX,  RESIZE_NONE, 10,   0,  10,   0,  13, STR_00C5,                    STR_018B_CLOSE_WINDOW },            // SNGRFS_CLOSEBOX
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   544
{    WWT_CAPTION, RESIZE_RIGHT, 10,  11, 299,   0,  13, STR_NEWGRF_SETTINGS_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS },  // SNGRFS_CAPTION
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   545
{      WWT_PANEL, RESIZE_RIGHT, 10,   0, 299,  14,  29, STR_NULL,                    STR_NULL },                         // SNGRFS_BACKGROUND
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   546
{ WWT_PUSHTXTBTN,  RESIZE_NONE,  3,  10,  79,  16,  27, STR_NEWGRF_ADD,              STR_NEWGRF_ADD_TIP },               // SNGRFS_ADD
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   547
{ WWT_PUSHTXTBTN,  RESIZE_NONE,  3,  80, 149,  16,  27, STR_NEWGRF_REMOVE,           STR_NEWGRF_REMOVE_TIP },            // SNGRFS_REMOVE
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   548
{ WWT_PUSHTXTBTN,  RESIZE_NONE,  3, 150, 219,  16,  27, STR_NEWGRF_MOVEUP,           STR_NEWGRF_MOVEUP_TIP },            // SNGRFS_MOVE_UP
9087
c6ff1721bb00 (svn r12172) -Codechange: Allow buttons to resize in NewGRF settings window
peter1138
parents: 8760
diff changeset
   549
{ WWT_PUSHTXTBTN, RESIZE_RIGHT,  3, 220, 289,  16,  27, STR_NEWGRF_MOVEDOWN,         STR_NEWGRF_MOVEDOWN_TIP },          // SNGRFS_MOVE_DOWN
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   550
{     WWT_MATRIX,    RESIZE_RB, 10,   0, 287,  30,  99, 0x501,                       STR_NEWGRF_FILE_TIP },              // SNGRFS_FILE_LIST
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   551
{  WWT_SCROLLBAR,   RESIZE_LRB, 10, 288, 299,  30,  99, 0x0,                         STR_0190_SCROLL_BAR_SCROLLS_LIST }, // SNGRFS_SCROLLBAR
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   552
{      WWT_PANEL,   RESIZE_RTB, 10,   0, 299, 100, 212, STR_NULL,                    STR_NULL },                         // SNGRFS_NEWGRF_INFO
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   553
{ WWT_PUSHTXTBTN,    RESIZE_TB, 10,   0, 143, 213, 224, STR_NEWGRF_SET_PARAMETERS,   STR_NULL },                         // SNGRFS_SET_PARAMETERS
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   554
{ WWT_PUSHTXTBTN,   RESIZE_RTB, 10, 144, 287, 213, 224, STR_NEWGRF_APPLY_CHANGES,    STR_NULL },                         // SNGRFS_APPLY_CHANGES
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   555
{  WWT_RESIZEBOX,  RESIZE_LRTB, 10, 288, 299, 213, 224, 0x0,                         STR_RESIZE_BUTTON },                // SNGRFS_RESIZE
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   556
{ WIDGETS_END },
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   557
};
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   558
8521
ca9e5d1537c9 (svn r11585) -Codechange: Enumify the widgets of the newGRF gui and a slight cleanup there
skidd13
parents: 8515
diff changeset
   559
/* Window definition of the manage newgrfs window */
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   560
static const WindowDesc _newgrf_desc = {
7837
65d7362153a6 (svn r10704) -Codechange: provide an infrastructure to have resizable windows that are smaller than the default window size.
rubidium
parents: 7530
diff changeset
   561
	WDP_CENTER, WDP_CENTER, 300, 225, 300, 225,
6144
5a0ffbf27ced (svn r8511) -Codechange: make WindowClass an enumerated value.
rubidium
parents: 5919
diff changeset
   562
	WC_GAME_OPTIONS, WC_NONE,
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   563
	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   564
	_newgrf_widgets,
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   565
};
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   566
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   567
/** Callback function for the newgrf 'apply changes' confirmation window
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   568
 * @param w Window which is calling this callback
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   569
 * @param confirmed boolean value, true when yes was clicked, false otherwise
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   570
 */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   571
static void NewGRFConfirmationCallback(Window *w, bool confirmed)
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   572
{
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   573
	if (confirmed) {
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   574
		NewGRFWindow *nw = dynamic_cast<NewGRFWindow*>(w);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   575
		GRFConfig *c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   576
		int i = 0;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   577
10824
1a34ba6f338a (svn r13375) -Add: logging of actions that could possibly cause desyncs and crashes to simplify debugging. See readme.txt for details
smatz
parents: 10641
diff changeset
   578
		GamelogStartAction(GLAT_GRF);
1a34ba6f338a (svn r13375) -Add: logging of actions that could possibly cause desyncs and crashes to simplify debugging. See readme.txt for details
smatz
parents: 10641
diff changeset
   579
		GamelogGRFUpdate(_grfconfig, nw->list); // log GRF changes
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   580
		CopyGRFConfigList(nw->orig_list, nw->list, false);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   581
		ReloadNewGRFData();
10824
1a34ba6f338a (svn r13375) -Add: logging of actions that could possibly cause desyncs and crashes to simplify debugging. See readme.txt for details
smatz
parents: 10641
diff changeset
   582
		GamelogStopAction();
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   583
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   584
		/* Show new, updated list */
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   585
		for (c = nw->list; c != NULL && c != nw->sel; c = c->next, i++) {}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   586
		CopyGRFConfigList(&nw->list, *nw->orig_list, false);
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   587
		for (c = nw->list; c != NULL && i > 0; c = c->next, i--) {}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   588
		nw->sel = c;
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   589
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   590
		w->SetDirty();
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   591
	}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   592
}
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   593
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   594
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   595
5352
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   596
/** Setup the NewGRF gui
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   597
 * @param editable allow the user to make changes to the grfconfig in the window
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   598
 * @param show_params show information about what parameters are set for the grf files
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   599
 * @param exec_changes if changes are made to the list (editable is true), apply these
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   600
 *        changes immediately or only update the list
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   601
 * @param config pointer to a linked-list of grfconfig's that will be shown */
82a50c80b0c4 (svn r7523) -Feature: Add the possibility to change the newgrf configuration of a running game.
Darkvater
parents: 5345
diff changeset
   602
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config)
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   603
{
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   604
	DeleteWindowByClass(WC_GAME_OPTIONS);
10529
a4d6b2fe51e3 (svn r13073) -Codechange: make classes of the NewGRF windows
peter1138
parents: 10484
diff changeset
   605
	new NewGRFWindow(&_newgrf_desc, editable, show_params, exec_changes, config);
5237
c14c97d7030a (svn r7357) -Codechange: new NewGRF set up window which allows modification of NewGRF settings.
peter1138
parents:
diff changeset
   606
}