Changeset - r10671:380271301e42
[Not reviewed]
master
0 2 0
rubidium - 16 years ago 2009-01-10 17:35:19
rubidium@openttd.org
(svn r14974) -Change: reorder/reorganise the entries of the settings window (Alberth)
2 files changed with 120 insertions and 43 deletions:
0 comments (0 inline, 0 general)
src/lang/english.txt
Show inline comments
 
@@ -1125,192 +1125,203 @@ STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LIST
 
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN                   :Own company
 
STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL                   :All companies
 
STR_CONFIG_PATCHES_LOADING_INDICATORS                           :{LTBLUE}Use loading indicators: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF                       :Off
 
STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN                       :Own company
 
STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL                       :All companies
 
STR_CONFIG_PATCHES_TIMETABLE_ALLOW                              :{LTBLUE}Enable timetabling for vehicles: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS                           :{LTBLUE}Show timetable in ticks rather than days: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_QUICKGOTO                                    :{LTBLUE}Quick creation of vehicle orders: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE                            :{LTBLUE}Default rail type (after new game/game load): {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL                       :Normal Rail
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL                     :Electrified Rail
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL                   :Monorail
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV                     :Maglev
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST                      :First available
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST                       :Last available
 
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED                  :Most used
 
STR_CONFIG_PATCHES_SHOW_TRACK_RESERVATION                       :{LTBLUE}Show reserved tracks: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_PERSISTENT_BUILDINGTOOLS                     :{LTBLUE}Keep building tools active after usage: {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE                  :{LTBLUE}Show building tools when no suitable vehicles are available: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max trains per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max road vehicles per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Max aircraft per player: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Max ships per player: {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Disable trains for computer: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Disable road vehicles for computer: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Disable aircraft for computer: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Disable ships for computer: {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Enable new AI (alpha): {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Allow AIs in multiplayer (experimental): {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Default service interval for trains: {ORANGE}{STRING1} days/%
 
STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Default service interval for trains: {ORANGE}disabled
 
STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Default service interval for road vehicles: {ORANGE}{STRING1} days/%
 
STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Default service interval for road vehicles: {ORANGE}disabled
 
STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Default service interval for aircraft: {ORANGE}{STRING1} days/%
 
STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Default service interval for aircraft: {ORANGE}disabled
 
STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Default service interval for ships: {ORANGE}{STRING1} days/%
 
STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Default service interval for ships: {ORANGE}disabled
 
STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Disable servicing when breakdowns set to none: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Enable wagon speed limits: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Disable electric rails: {ORANGE}{STRING1}
 

	
 
STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Coloured news appears in: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Starting year: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Enable smooth economy (more, smaller changes)
 
STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Allow buying shares from other companies
 
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}When dragging, place signals every: {ORANGE}{STRING1} tile(s)
 
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatically build semaphores before: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI                            :{LTBLUE}Enable the signal GUI: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_DEFAULT_SIGNAL_TYPE                          :{LTBLUE}Signal type to build by default: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_DEFAULT_SIGNAL_NORMAL                        :Block signals
 
STR_CONFIG_PATCHES_DEFAULT_SIGNAL_PBS                           :Path signals
 
STR_CONFIG_PATCHES_DEFAULT_SIGNAL_PBSOWAY                       :One-way path signals
 
STR_CONFIG_PATCHES_CYCLE_SIGNAL_TYPES                           :{LTBLUE}Cycle through signal types: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_CYCLE_SIGNAL_NORMAL                          :Block signals only
 
STR_CONFIG_PATCHES_CYCLE_SIGNAL_PBS                             :Path signals only
 
STR_CONFIG_PATCHES_CYCLE_SIGNAL_ALL                             :All
 

	
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}The town layout "no more roads" isn't valid in the scenario editor
 
STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Select town-road layout: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :no more roads
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :better roads
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 grid
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
 
STR_CONFIG_PATCHES_TOWN_LAYOUT_RANDOM                           :random
 

	
 
STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position of main toolbar: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Left
 
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
 
STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Right
 
STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Window snap radius: {ORANGE}{STRING1} px
 
STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Window snap radius: {ORANGE}disabled
 
STR_CONFIG_PATCHES_SOFT_LIMIT                                   :{LTBLUE}Window soft limit (non-sticky): {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_SOFT_LIMIT_DISABLED                          :{LTBLUE}Window soft limit (non-sticky): {ORANGE}disabled
 
STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Town growth speed: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :None
 
STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Slow
 
STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
 
STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Fast
 
STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Very fast
 
STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion of towns that will become cities: {ORANGE}1 in {STRING1}
 
STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion of towns that will become cities: {ORANGE}None
 
STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial city size multiplier: {ORANGE}{STRING1}
 
STR_CONFIG_MODIFIED_ROAD_REBUILD                                :{LTBLUE}Remove absurd road-elements during the road construction
 

	
 
STR_CONFIG_PATCHES_GUI                                          :{ORANGE}Interface
 
STR_CONFIG_PATCHES_CONSTRUCTION                                 :{ORANGE}Construction
 
STR_CONFIG_PATCHES_VEHICLES                                     :{ORANGE}Vehicles
 
STR_CONFIG_PATCHES_STATIONS                                     :{ORANGE}Stations
 
STR_CONFIG_PATCHES_ECONOMY                                      :{ORANGE}Economy
 
STR_CONFIG_PATCHES_AI                                           :{ORANGE}Competitors
 
STR_CONFIG_PATCHES_DISPLAY_OPTIONS                              :{ORANGE}Display options
 
STR_CONFIG_PATCHES_INTERACTION                                  :{ORANGE}Interaction
 
STR_CONFIG_PATCHES_CONSTRUCTION_SIGNALS                         :{ORANGE}Signals
 
STR_CONFIG_PATCHES_STATIONS_CARGOHANDLING                       :{ORANGE}Cargo handling
 
STR_CONFIG_PATCHES_AI_NPC                                       :{ORANGE}Computer players
 
STR_CONFIG_PATCHES_VEHICLES_AUTORENEW                           :{ORANGE}Autorenew
 
STR_CONFIG_PATCHES_VEHICLES_SERVICING                           :{ORANGE}Servicing
 
STR_CONFIG_PATCHES_VEHICLES_ROUTING                             :{ORANGE}Routing
 
STR_CONFIG_PATCHES_VEHICLES_TRAINS                              :{ORANGE}Trains
 
STR_CONFIG_PATCHES_ECONOMY_TOWNS                                :{ORANGE}Towns
 
STR_CONFIG_PATCHES_ECONOMY_INDUSTRIES                           :{ORANGE}Industries
 

	
 
STR_CONFIG_PATCHES_DISABLED                                     :disabled
 
STR_CONFIG_PATCHES_INT32                                        :{NUM}
 
STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
 

	
 
STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Change setting value
 

	
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS                        :{LTBLUE}Pathfinder for trains: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP                    :NTP {RED}(Not recommended)
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF                    :NPF
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF                   :YAPF {BLUE}(Recommended)
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH                       :{LTBLUE}Pathfinder for road vehicles: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF                   :Original {RED}(Not recommended)
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF                   :NPF
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF                  :YAPF {BLUE}(Recommended)
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS                         :{LTBLUE}Pathfinder for ships: {ORANGE}{STRING1}
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF                     :Original {BLUE}(Recommended)
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF                     :NPF
 
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF                    :YAPF {RED}(Not recommended)
 

	
 
STR_TEMPERATE_LANDSCAPE                                         :Temperate landscape
 
STR_SUB_ARCTIC_LANDSCAPE                                        :Sub-arctic landscape
 
STR_SUB_TROPICAL_LANDSCAPE                                      :Sub-tropical landscape
 
STR_TOYLAND_LANDSCAPE                                           :Toyland landscape
 

	
 
STR_CHEATS                                                      :{WHITE}Cheats
 
STR_CHEATS_TIP                                                  :{BLACK}Checkboxes indicate if you have used this cheat before
 
STR_CHEATS_WARNING                                              :{BLACK}Warning! You are about to betray your fellow competitors. Keep in mind that such a disgrace will be remembered for eternity.
 
STR_CHEAT_MONEY                                                 :{LTBLUE}Increase money by {CURRENCY}
 
STR_CHEAT_CHANGE_COMPANY                                        :{LTBLUE}Playing as company: {ORANGE}{COMMA}
 
STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Magic bulldozer (remove industries, unmovables): {ORANGE}{STRING1}
 
STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}Tunnels may cross each other: {ORANGE}{STRING1}
 
STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Build while in pause mode: {ORANGE}{STRING1}
 
STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Jetplanes will not crash (frequently) on small airports: {ORANGE} {STRING}
 
STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Switch climate: {ORANGE} {STRING}
 
STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Change date: {ORANGE} {DATE_SHORT}
 
STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Enable modifying production values: {ORANGE}{STRING1}
 

	
 
STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Heading for {WAYPOINT}
 
STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Heading for {WAYPOINT}, {VELOCITY}
 

	
 
STR_GO_TO_WAYPOINT                                              :Go via {WAYPOINT}
 
STR_GO_NON_STOP_TO_WAYPOINT                                     :Go non-stop via {WAYPOINT}
 

	
 
STR_WAYPOINTNAME_CITY                                           :Waypoint {TOWN}
 
STR_WAYPOINTNAME_CITY_SERIAL                                    :Waypoint {TOWN} #{COMMA}
 
STR_LANDINFO_WAYPOINT                                           :Waypoint
 

	
 
STR_WAYPOINT                                                    :{WHITE}Waypoint
 
STR_WAYPOINT_GRAPHICS_TIP                                       :{BLACK}Select waypoint type
 

	
 
STR_WAYPOINT_VIEWPORT                                           :{WHITE}{WAYPOINT}
 
STR_WAYPOINT_VIEWPORT_LIST                                      :{WHITE}{WAYPOINT} - {COMMA} Train{P "" s}
 
STR_WAYPOINT_VIEWPORT_TINY                                      :{TINYFONT}{WHITE}{WAYPOINT}
 
STR_WAYPOINT_RAW                                                :{WAYPOINT}
 
STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Edit waypoint name
 

	
 
STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Can't change waypoint name...
 
STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Convert rail to waypoint
 
STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Can't build train waypoint here...
 
STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Can't remove train waypoint here...
 

	
 
STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Build railway track using the Autorail mode
 

	
 
STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...there is no town in this scenario
 

	
 
STR_GENERATE_RANDOM_LANDSCAPE                                   :{WHITE}Are you sure you want to create a random landscape?
 
STR_MANY_RANDOM_TOWNS                                           :{BLACK}Many random towns
 
STR_RANDOM_TOWNS_TIP                                            :{BLACK}Cover the map with randomly placed towns
 
STR_MANY_RANDOM_INDUSTRIES                                      :Many random industries
 
STR_RANDOM_INDUSTRIES_TIP                                       :{BLACK}Cover the map with randomly placed industries
 
STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Can't generate industries...
 

	
 
STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Open the landscaping toolbar to raise/lower land, plant trees, etc.
 
STR_LANDSCAPING_TOOLBAR                                         :{WHITE}Landscaping
 
STR_LEVEL_LAND_TOOLTIP                                          :{BLACK}Level land
 

	
 

	
 
STR_TREES_RANDOM_TYPE                                           :{BLACK}Trees of random type
 
STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Place trees of random type
 

	
 
STR_CANT_BUILD_CANALS                                           :{WHITE}Can't build canals here...
 
STR_BUILD_CANALS_TIP                                            :{BLACK}Build canals.
 
STR_LANDINFO_CANAL                                              :Canal
 

	
 
STR_CANT_BUILD_LOCKS                                            :{WHITE}Can't build locks here...
 
STR_BUILD_LOCKS_TIP                                             :{BLACK}Build locks
 
STR_LANDINFO_LOCK                                               :Lock
 

	
 
STR_CANT_PLACE_RIVERS                                           :{WHITE}Can't place rivers here...
 
STR_LANDINFO_RIVER                                              :River
 

	
 
STR_BUOY_IS_IN_USE                                              :{WHITE}...buoy is in use!
 

	
 
STR_LANDINFO_COORDS                                             :{BLACK}Coordinates: {LTBLUE}{NUM}x{NUM}x{NUM} ({RAW_STRING})
 

	
src/settings_gui.cpp
Show inline comments
 
@@ -896,327 +896,393 @@ void PatchEntry::DrawPatch(GameSettings 
 
			SetDParam(0, STR_CONFIG_PATCHES_DISABLED);
 
		} else {
 
			if (sdb->flags & SGF_CURRENCY) {
 
				SetDParam(0, STR_CONFIG_PATCHES_CURRENCY);
 
			} else if (sdb->flags & SGF_MULTISTRING) {
 
				SetDParam(0, sdb->str + value + 1);
 
			} else {
 
				SetDParam(0, (sdb->flags & SGF_NOCOMMA) ? STR_CONFIG_PATCHES_INT32 : STR_7024);
 
			}
 
			SetDParam(1, value);
 
		}
 
	}
 
	DrawString(x + 25, y, (sdb->str) + disabled, TC_FROMSTRING);
 
}
 

	
 

	
 
/* == PatchPage methods == */
 

	
 
/**
 
 * Initialization of an entire setting page
 
 * @param level Nesting level of this page (internal variable, do not provide a value for it when calling)
 
 */
 
void PatchPage::Init(byte level)
 
{
 
	for (uint field = 0; field < this->num; field++) {
 
		this->entries[field].Init(level, field + 1 == num);
 
	}
 
}
 

	
 
/** Recursively close all folds of sub-pages */
 
void PatchPage::FoldAll()
 
{
 
	for (uint field = 0; field < this->num; field++) {
 
		this->entries[field].FoldAll();
 
	}
 
}
 

	
 
/** Return number of rows needed to display the whole page */
 
uint PatchPage::Length() const
 
{
 
	uint length = 0;
 
	for (uint field = 0; field < this->num; field++) {
 
		length += this->entries[field].Length();
 
	}
 
	return length;
 
}
 

	
 
/**
 
 * Find the patch entry at row number \a row_num
 
 * @param row_num Index of entry to return
 
 * @param cur_row Variable used for keeping track of the current row number. Should point to memory initialized to \c 0 when first called.
 
 * @return The requested patch entry or \c NULL if it does not exist
 
 */
 
PatchEntry *PatchPage::FindEntry(uint row_num, uint *cur_row) const
 
{
 
	PatchEntry *pe = NULL;
 

	
 
	for (uint field = 0; field < this->num; field++) {
 
		pe = this->entries[field].FindEntry(row_num, cur_row);
 
		if (pe != NULL) {
 
			break;
 
		}
 
	}
 
	return pe;
 
}
 

	
 
/**
 
 * Draw a selected part of the settings page.
 
 *
 
 * The scrollbar uses rows of the page, while the page data strucure is a tree of #PatchPage and #PatchEntry objects.
 
 * As a result, the drawing routing traverses the tree from top to bottom, counting rows in \a cur_row until it reaches \a first_row.
 
 * Then it enables drawing rows while traversing until \a max_row is reached, at which point drawing is terminated.
 
 *
 
 * @param patches_ptr Pointer to current values of all settings
 
 * @param base_x      Left-most position in window/panel to start drawing of each setting row
 
 * @param base_y      Upper-most position in window/panel to start drawing of row number \a first_row
 
 * @param first_row   Number of first row to draw
 
 * @param max_row     Row-number to stop drawing (the row-number of the row below the last row to draw)
 
 * @param cur_row     Current row number (internal variable)
 
 * @param parent_last Last-field booleans of parent page level (page level \e i sets bit \e i to 1 if it is its last field)
 
 * @return Row number of the next row to draw
 
 */
 
uint PatchPage::Draw(GameSettings *patches_ptr, int base_x, int base_y, uint first_row, uint max_row, uint cur_row, uint parent_last) const
 
{
 
	if (cur_row >= max_row) return cur_row;
 

	
 
	for (uint i = 0; i < this->num; i++) {
 
		cur_row = this->entries[i].Draw(patches_ptr, base_x, base_y, first_row, max_row, cur_row, parent_last);
 
		if (cur_row >= max_row) {
 
			break;
 
		}
 
	}
 
	return cur_row;
 
}
 

	
 

	
 
static PatchEntry _patches_ui[] = {
 
static PatchEntry _patches_ui_display[] = {
 
	PatchEntry("gui.vehicle_speed"),
 
	PatchEntry("gui.status_long_date"),
 
	PatchEntry("gui.date_format_in_default_names"),
 
	PatchEntry("gui.show_finances"),
 
	PatchEntry("gui.population_in_label"),
 
	PatchEntry("gui.measure_tooltip"),
 
	PatchEntry("gui.loading_indicators"),
 
	PatchEntry("gui.liveries"),
 
	PatchEntry("gui.show_track_reservation"),
 
};
 
/** Display options sub-page */
 
static PatchPage _patches_ui_display_page = {_patches_ui_display, lengthof(_patches_ui_display)};
 

	
 
static PatchEntry _patches_ui_interaction[] = {
 
	PatchEntry("gui.autoscroll"),
 
	PatchEntry("gui.reverse_scroll"),
 
	PatchEntry("gui.smooth_scroll"),
 
	PatchEntry("gui.errmsg_duration"),
 
	PatchEntry("gui.toolbar_pos"),
 
	PatchEntry("gui.measure_tooltip"),
 
	PatchEntry("gui.window_snap_radius"),
 
	PatchEntry("gui.window_soft_limit"),
 
	PatchEntry("gui.population_in_label"),
 
	PatchEntry("gui.link_terraform_toolbar"),
 
	PatchEntry("gui.liveries"),
 
	PatchEntry("gui.prefer_teamchat"),
 
	/* While the horizontal scrollwheel scrolling is written as general code, only
 
	 *  the cocoa (OSX) driver generates input for it.
 
	 *  Since it's also able to completely disable the scrollwheel will we display it on all platforms anyway */
 
	PatchEntry("gui.scrollwheel_scrolling"),
 
	PatchEntry("gui.scrollwheel_multiplier"),
 
#ifdef __APPLE__
 
	/* We might need to emulate a right mouse button on mac */
 
	PatchEntry("gui.right_mouse_btn_emulation"),
 
#endif
 
	PatchEntry("gui.left_mouse_btn_scrolling"),
 
};
 
/** Interaction sub-page */
 
static PatchPage _patches_ui_interaction_page = {_patches_ui_interaction, lengthof(_patches_ui_interaction)};
 

	
 
static PatchEntry _patches_ui[] = {
 
	PatchEntry(&_patches_ui_display_page, STR_CONFIG_PATCHES_DISPLAY_OPTIONS),
 
	PatchEntry(&_patches_ui_interaction_page, STR_CONFIG_PATCHES_INTERACTION),
 
	PatchEntry("gui.show_finances"),
 
	PatchEntry("gui.errmsg_duration"),
 
	PatchEntry("gui.toolbar_pos"),
 
	PatchEntry("gui.pause_on_newgame"),
 
	PatchEntry("gui.advanced_vehicle_list"),
 
	PatchEntry("gui.loading_indicators"),
 
	PatchEntry("gui.timetable_in_ticks"),
 
	PatchEntry("gui.quick_goto"),
 
	PatchEntry("gui.default_rail_type"),
 
	PatchEntry("gui.always_build_infrastructure"),
 
	PatchEntry("gui.persistent_buildingtools"),
 
	PatchEntry("gui.show_track_reservation"),
 
	PatchEntry("gui.left_mouse_btn_scrolling"),
 
};
 
/** Interface subpage */
 
static PatchPage _patches_ui_page = {_patches_ui, lengthof(_patches_ui)};
 

	
 
static PatchEntry _patches_construction_signals[] = {
 
	PatchEntry("construction.signal_side"),
 
	PatchEntry("gui.enable_signal_gui"),
 
	PatchEntry("gui.drag_signals_density"),
 
	PatchEntry("gui.semaphore_build_before"),
 
	PatchEntry("gui.default_signal_type"),
 
	PatchEntry("gui.cycle_signal_types"),
 
};
 
/** Signals subpage */
 
static PatchPage _patches_construction_signals_page = {_patches_construction_signals, lengthof(_patches_construction_signals)};
 

	
 
static PatchEntry _patches_construction[] = {
 
	PatchEntry(&_patches_construction_signals_page, STR_CONFIG_PATCHES_CONSTRUCTION_SIGNALS),
 
	PatchEntry("construction.build_on_slopes"),
 
	PatchEntry("construction.autoslope"),
 
	PatchEntry("construction.extra_dynamite"),
 
	PatchEntry("construction.longbridges"),
 
	PatchEntry("construction.signal_side"),
 
	PatchEntry("station.always_small_airport"),
 
	PatchEntry("gui.enable_signal_gui"),
 
	PatchEntry("gui.drag_signals_density"),
 
	PatchEntry("game_creation.oil_refinery_limit"),
 
	PatchEntry("gui.semaphore_build_before"),
 
	PatchEntry("gui.default_signal_type"),
 
	PatchEntry("gui.cycle_signal_types"),
 
};
 
/** Construction sub-page */
 
static PatchPage _patches_construction_page = {_patches_construction, lengthof(_patches_construction)};
 

	
 
static PatchEntry _patches_stations_cargo[] = {
 
	PatchEntry("order.improved_load"),
 
	PatchEntry("order.gradual_loading"),
 
	PatchEntry("order.selectgoods"),
 
};
 
/** Cargo handling sub-page */
 
static PatchPage _patches_stations_cargo_page = {_patches_stations_cargo, lengthof(_patches_stations_cargo)};
 

	
 
static PatchEntry _patches_stations[] = {
 
	PatchEntry(&_patches_stations_cargo_page, STR_CONFIG_PATCHES_STATIONS_CARGOHANDLING),
 
	PatchEntry("station.join_stations"),
 
	PatchEntry("order.improved_load"),
 
	PatchEntry("order.selectgoods"),
 
	PatchEntry("gui.new_nonstop"),
 
	PatchEntry("station.nonuniform_stations"),
 
	PatchEntry("station.station_spread"),
 
	PatchEntry("order.serviceathelipad"),
 
	PatchEntry("station.modified_catchment"),
 
	PatchEntry("order.gradual_loading"),
 
	PatchEntry("construction.road_stop_on_town_road"),
 
	PatchEntry("station.adjacent_stations"),
 
	PatchEntry("station.distant_join_stations"),
 
	PatchEntry("economy.station_noise_level"),
 
};
 
/** Stations sub-page */
 
static PatchPage _patches_stations_page = {_patches_stations, lengthof(_patches_stations)};
 

	
 
static PatchEntry _patches_economy[] = {
 
	PatchEntry("economy.inflation"),
 
	PatchEntry("construction.raw_industry_construction"),
 
	PatchEntry("economy.multiple_industry_per_town"),
 
	PatchEntry("economy.same_industry_close"),
 
static PatchEntry _patches_economy_towns[] = {
 
	PatchEntry("economy.bribe"),
 
	PatchEntry("economy.exclusive_rights"),
 
	PatchEntry("economy.give_money"),
 
	PatchEntry("gui.colored_news_year"),
 
	PatchEntry("economy.smooth_economy"),
 
	PatchEntry("economy.allow_shares"),
 
	PatchEntry("economy.town_layout"),
 
	PatchEntry("economy.mod_road_rebuild"),
 
	PatchEntry("economy.town_growth_rate"),
 
	PatchEntry("economy.larger_towns"),
 
	PatchEntry("economy.initial_city_size"),
 
};
 
/** Towns sub-page */
 
static PatchPage _patches_economy_towns_page = {_patches_economy_towns, lengthof(_patches_economy_towns)};
 

	
 
static PatchEntry _patches_economy_industries[] = {
 
	PatchEntry("construction.raw_industry_construction"),
 
	PatchEntry("economy.multiple_industry_per_town"),
 
	PatchEntry("economy.same_industry_close"),
 
};
 
/** Industries sub-page */
 
static PatchPage _patches_economy_industries_page = {_patches_economy_industries, lengthof(_patches_economy_industries)};
 

	
 
static PatchEntry _patches_economy[] = {
 
	PatchEntry(&_patches_economy_towns_page, STR_CONFIG_PATCHES_ECONOMY_TOWNS),
 
	PatchEntry(&_patches_economy_industries_page, STR_CONFIG_PATCHES_ECONOMY_INDUSTRIES),
 
	PatchEntry("economy.inflation"),
 
	PatchEntry("gui.colored_news_year"),
 
	PatchEntry("economy.smooth_economy"),
 
};
 
/** Economy sub-page */
 
static PatchPage _patches_economy_page = {_patches_economy, lengthof(_patches_economy)};
 

	
 
static PatchEntry _patches_ai[] = {
 
static PatchEntry _patches_ai_npc[] = {
 
	PatchEntry("ai.ainew_active"),
 
	PatchEntry("ai.ai_in_multiplayer"),
 
	PatchEntry("ai.ai_disable_veh_train"),
 
	PatchEntry("ai.ai_disable_veh_roadveh"),
 
	PatchEntry("ai.ai_disable_veh_aircraft"),
 
	PatchEntry("ai.ai_disable_veh_ship"),
 
};
 
/** Computer players sub-page */
 
static PatchPage _patches_ai_npc_page = {_patches_ai_npc, lengthof(_patches_ai_npc)};
 

	
 
static PatchEntry _patches_ai[] = {
 
	PatchEntry(&_patches_ai_npc_page, STR_CONFIG_PATCHES_AI_NPC),
 
	PatchEntry("economy.give_money"),
 
	PatchEntry("economy.allow_shares"),
 
};
 
/** AI sub-page */
 
static PatchPage _patches_ai_page = {_patches_ai, lengthof(_patches_ai)};
 

	
 
static PatchEntry _patches_vehicles[] = {
 
	PatchEntry("vehicle.realistic_acceleration"),
 
	PatchEntry("pf.forbid_90_deg"),
 
	PatchEntry("vehicle.mammoth_trains"),
 
	PatchEntry("order.gotodepot"),
 
	PatchEntry("pf.roadveh_queue"),
 
static PatchEntry _patches_vehicles_routing[] = {
 
	PatchEntry("pf.pathfinder_for_trains"),
 
	PatchEntry("pf.forbid_90_deg"),
 
	PatchEntry("pf.pathfinder_for_roadvehs"),
 
	PatchEntry("pf.roadveh_queue"),
 
	PatchEntry("pf.pathfinder_for_ships"),
 
	PatchEntry("gui.vehicle_income_warn"),
 
	PatchEntry("gui.order_review_system"),
 
	PatchEntry("vehicle.never_expire_vehicles"),
 
	PatchEntry("gui.lost_train_warn"),
 
};
 
/** Autorenew sub-page */
 
static PatchPage _patches_vehicles_routing_page = {_patches_vehicles_routing, lengthof(_patches_vehicles_routing)};
 

	
 
static PatchEntry _patches_vehicles_autorenew[] = {
 
	PatchEntry("gui.autorenew"),
 
	PatchEntry("gui.autorenew_months"),
 
	PatchEntry("gui.autorenew_money"),
 
	PatchEntry("vehicle.max_trains"),
 
	PatchEntry("vehicle.max_roadveh"),
 
	PatchEntry("vehicle.max_aircraft"),
 
	PatchEntry("vehicle.max_ships"),
 
};
 
/** Autorenew sub-page */
 
static PatchPage _patches_vehicles_autorenew_page = {_patches_vehicles_autorenew, lengthof(_patches_vehicles_autorenew)};
 

	
 
static PatchEntry _patches_vehicles_servicing[] = {
 
	PatchEntry("vehicle.servint_ispercent"),
 
	PatchEntry("vehicle.servint_trains"),
 
	PatchEntry("vehicle.servint_roadveh"),
 
	PatchEntry("vehicle.servint_ships"),
 
	PatchEntry("vehicle.servint_aircraft"),
 
	PatchEntry("order.no_servicing_if_no_breakdowns"),
 
};
 
/** Servicing sub-page */
 
static PatchPage _patches_vehicles_servicing_page = {_patches_vehicles_servicing, lengthof(_patches_vehicles_servicing)};
 

	
 
static PatchEntry _patches_vehicles_trains[] = {
 
	PatchEntry("vehicle.realistic_acceleration"),
 
	PatchEntry("vehicle.mammoth_trains"),
 
	PatchEntry("gui.vehicle_income_warn"),
 
	PatchEntry("gui.lost_train_warn"),
 
	PatchEntry("vehicle.wagon_speed_limits"),
 
	PatchEntry("vehicle.disable_elrails"),
 
	PatchEntry("vehicle.freight_trains"),
 
};
 
/** Trains sub-page */
 
static PatchPage _patches_vehicles_trains_page = {_patches_vehicles_trains, lengthof(_patches_vehicles_trains)};
 

	
 
static PatchEntry _patches_vehicles[] = {
 
	PatchEntry(&_patches_vehicles_routing_page, STR_CONFIG_PATCHES_VEHICLES_ROUTING),
 
	PatchEntry(&_patches_vehicles_autorenew_page, STR_CONFIG_PATCHES_VEHICLES_AUTORENEW),
 
	PatchEntry(&_patches_vehicles_servicing_page, STR_CONFIG_PATCHES_VEHICLES_SERVICING),
 
	PatchEntry(&_patches_vehicles_trains_page, STR_CONFIG_PATCHES_VEHICLES_TRAINS),
 
	PatchEntry("order.gotodepot"),
 
	PatchEntry("gui.order_review_system"),
 
	PatchEntry("vehicle.never_expire_vehicles"),
 
	PatchEntry("vehicle.max_trains"),
 
	PatchEntry("vehicle.max_roadveh"),
 
	PatchEntry("vehicle.max_aircraft"),
 
	PatchEntry("vehicle.max_ships"),
 
	PatchEntry("vehicle.plane_speed"),
 
	PatchEntry("order.timetabling"),
 
	PatchEntry("vehicle.dynamic_engines"),
 
};
 
/** Vehicles sub-page */
 
static PatchPage _patches_vehicles_page = {_patches_vehicles, lengthof(_patches_vehicles)};
 

	
 
static PatchEntry _patches_main[] = {
 
	PatchEntry(&_patches_ui_page,           STR_CONFIG_PATCHES_GUI),
 
	PatchEntry(&_patches_construction_page, STR_CONFIG_PATCHES_CONSTRUCTION),
 
	PatchEntry(&_patches_vehicles_page,     STR_CONFIG_PATCHES_VEHICLES),
 
	PatchEntry(&_patches_stations_page,     STR_CONFIG_PATCHES_STATIONS),
 
	PatchEntry(&_patches_economy_page,      STR_CONFIG_PATCHES_ECONOMY),
 
	PatchEntry(&_patches_ai_page,           STR_CONFIG_PATCHES_AI),
 
};
 

	
 
/** Main page, holding all advanced settings */
 
static PatchPage _patches_main_page = {_patches_main, lengthof(_patches_main)};
 

	
 
/** Widget numbers of config patches window */
 
enum PatchesSelectionWidgets {
 
	PATCHSEL_OPTIONSPANEL = 2, ///< Panel widget containing the option lists
 
	PATCHSEL_SCROLLBAR,        ///< Scrollbar
 
	PATCHSEL_RESIZE,           ///< Resize button
 
};
 

	
 
struct PatchesSelectionWindow : Window {
 
	static const int SETTINGTREE_LEFT_OFFSET; ///< Position of left edge of patch values
 
	static const int SETTINGTREE_TOP_OFFSET;  ///< Position of top edge of patch values
 

	
 
	static GameSettings *patches_ptr;  ///< Pointer to the game settings being displayed and modified
 

	
 
	PatchEntry *valuewindow_entry; ///< If non-NULL, pointer to patch setting for which a value-entering window has been opened
 
	PatchEntry *clicked_entry; ///< If non-NULL, pointer to a clicked numeric patch setting (with a depressed left or right button)
 

	
 
	PatchesSelectionWindow(const WindowDesc *desc) : Window(desc)
 
	{
 
		/* Check that the widget doesn't get moved without adapting the constant as well.
 
		 *  - SETTINGTREE_LEFT_OFFSET should be 5 pixels to the right of the left edge of the panel
 
		 *  - SETTINGTREE_TOP_OFFSET should be 5 pixels below the top edge of the panel
 
		 */
 
		assert(this->widget[PATCHSEL_OPTIONSPANEL].left + 5 == SETTINGTREE_LEFT_OFFSET);
 
		assert(this->widget[PATCHSEL_OPTIONSPANEL].top + 5 == SETTINGTREE_TOP_OFFSET);
 

	
 
		static bool first_time = true;
 

	
 
		patches_ptr = (_game_mode == GM_MENU) ? &_settings_newgame : &_settings_game;
 

	
 
		/* Build up the dynamic settings-array only once per OpenTTD session */
 
		if (first_time) {
 
			_patches_main_page.Init();
 
			first_time = false;
 
		} else {
 
			_patches_main_page.FoldAll(); // Close all sub-pages
 
		}
 

	
 
		this->valuewindow_entry = NULL; // No patch entry for which a entry window is opened
 
		this->clicked_entry = NULL; // No numeric patch setting buttons are depressed
 
		this->vscroll.pos = 0;
 
		this->vscroll.cap = (this->widget[PATCHSEL_OPTIONSPANEL].bottom - this->widget[PATCHSEL_OPTIONSPANEL].top - 8) / SETTING_HEIGHT;
 
		SetVScrollCount(this, _patches_main_page.Length());
 

	
 
		this->resize.step_height = SETTING_HEIGHT;
 
		this->resize.height = this->height;
 
		this->resize.step_width = 1;
 
		this->resize.width = this->width;
 

	
 
		this->FindWindowPlacementAndResize(desc);
 
	}
 

	
 
	virtual void OnPaint()
 
	{
 
		this->DrawWidgets();
 
		_patches_main_page.Draw(patches_ptr, SETTINGTREE_LEFT_OFFSET, SETTINGTREE_TOP_OFFSET,
 
						this->vscroll.pos, this->vscroll.pos + this->vscroll.cap);
 
	}
 

	
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		switch (widget) {
 
			case PATCHSEL_OPTIONSPANEL: {
 
				int y = pt.y - SETTINGTREE_TOP_OFFSET;  // Shift y coordinate
 
				if (y < 0) return;  // Clicked above first entry
 

	
 
				byte btn = this->vscroll.pos + y / SETTING_HEIGHT;  // Compute which setting is selected
 
				if (y % SETTING_HEIGHT > SETTING_HEIGHT - 2) return;  // Clicked too low at the setting
 

	
 
				uint cur_row = 0;
 
				PatchEntry *pe = _patches_main_page.FindEntry(btn, &cur_row);
 

	
 
				if (pe == NULL) return;  // Clicked below the last setting of the page
 

	
 
				int x = pt.x - SETTINGTREE_LEFT_OFFSET - (pe->level + 1) * LEVEL_WIDTH;  // Shift x coordinate
 
				if (x < 0) return;  // Clicked left of the entry
 

	
 
				if ((pe->flags & PEF_KIND_MASK) == PEF_SUBTREE_KIND) {
0 comments (0 inline, 0 general)