|
|
|
@ -31,6 +31,9 @@
|
|
|
|
|
#include "core/geometry_func.hpp"
|
|
|
|
|
#include "economy_func.h"
|
|
|
|
|
#include "object_type.h"
|
|
|
|
|
#include "rail.h"
|
|
|
|
|
#include "engine_base.h"
|
|
|
|
|
#include "window_func.h"
|
|
|
|
|
|
|
|
|
|
#include "table/strings.h"
|
|
|
|
|
|
|
|
|
@ -39,6 +42,7 @@ static const uint EXP_LINESPACE = 2; ///< Amount of vertical space for a h
|
|
|
|
|
static const uint EXP_BLOCKSPACE = 10; ///< Amount of vertical space between two blocks of numbers.
|
|
|
|
|
|
|
|
|
|
static void DoSelectCompanyManagerFace(Window *parent);
|
|
|
|
|
static void ShowCompanyInfrastructure(CompanyID company);
|
|
|
|
|
|
|
|
|
|
/** Standard unsorted list of expenses. */
|
|
|
|
|
static ExpensesType _expenses_list_1[] = {
|
|
|
|
@ -138,6 +142,7 @@ enum CompanyFinancesWindowWidgets {
|
|
|
|
|
CFW_SEL_BUTTONS, ///< Selection of buttons
|
|
|
|
|
CFW_INCREASE_LOAN, ///< Increase loan
|
|
|
|
|
CFW_REPAY_LOAN, ///< Decrease loan
|
|
|
|
|
CFW_INFRASTRUCTURE,///< View company infrastructure
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -276,6 +281,7 @@ static const NWidgetPart _nested_company_finances_widgets[] = {
|
|
|
|
|
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
|
|
|
|
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_INCREASE_LOAN), SetFill(1, 0), SetDataTip(STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP),
|
|
|
|
|
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_REPAY_LOAN), SetFill(1, 0), SetDataTip(STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP),
|
|
|
|
|
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_INFRASTRUCTURE), SetFill(1, 0), SetDataTip(STR_FINANCES_INFRASTRUCTURE_BUTTON, STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
};
|
|
|
|
@ -457,6 +463,10 @@ struct CompanyFinancesWindow : Window {
|
|
|
|
|
case CFW_REPAY_LOAN: // repay loan
|
|
|
|
|
DoCommandP(0, 0, _ctrl_pressed, CMD_DECREASE_LOAN | CMD_MSG(STR_ERROR_CAN_T_REPAY_LOAN));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CFW_INFRASTRUCTURE: // show infrastructure details
|
|
|
|
|
ShowCompanyInfrastructure((CompanyID)this->window_number);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1603,6 +1613,286 @@ static void DoSelectCompanyManagerFace(Window *parent)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Names of the widgets of the #CompanyInfrastructureWindow. */
|
|
|
|
|
enum CompanyInfrastructureWindowWidgets {
|
|
|
|
|
CIW_WIDGET_CAPTION,
|
|
|
|
|
CIW_WIDGET_RAIL_DESC,
|
|
|
|
|
CIW_WIDGET_RAIL_COUNT,
|
|
|
|
|
CIW_WIDGET_ROAD_DESC,
|
|
|
|
|
CIW_WIDGET_ROAD_COUNT,
|
|
|
|
|
CIW_WIDGET_WATER_DESC,
|
|
|
|
|
CIW_WIDGET_WATER_COUNT,
|
|
|
|
|
CIW_WIDGET_STATION_DESC,
|
|
|
|
|
CIW_WIDGET_STATION_COUNT,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const NWidgetPart _nested_company_infrastructure_widgets[] = {
|
|
|
|
|
NWidget(NWID_HORIZONTAL),
|
|
|
|
|
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
|
|
|
|
|
NWidget(WWT_CAPTION, COLOUR_GREY, CIW_WIDGET_CAPTION), SetDataTip(STR_COMPANY_INFRASTRUCTURE_VIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
|
|
|
|
NWidget(WWT_SHADEBOX, COLOUR_GREY),
|
|
|
|
|
NWidget(WWT_STICKYBOX, COLOUR_GREY),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(WWT_PANEL, COLOUR_GREY),
|
|
|
|
|
NWidget(NWID_VERTICAL), SetPIP(WD_FRAMERECT_TOP, 4, WD_FRAMETEXT_BOTTOM),
|
|
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_RAIL_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_RAIL_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_ROAD_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_ROAD_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_WATER_DESC), SetMinimalTextLines(2, 0), SetFill(1, 0),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_WATER_COUNT), SetMinimalTextLines(2, 0), SetFill(0, 1),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(2, 4, 2),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_STATION_DESC), SetMinimalTextLines(3, 0), SetFill(1, 0),
|
|
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, CIW_WIDGET_STATION_COUNT), SetMinimalTextLines(3, 0), SetFill(0, 1),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Window with detailed information about the company's infrastructure.
|
|
|
|
|
*/
|
|
|
|
|
struct CompanyInfrastructureWindow : Window
|
|
|
|
|
{
|
|
|
|
|
RailTypes railtypes; ///< Valid railtypes.
|
|
|
|
|
RoadTypes roadtypes; ///< Valid roadtypes.
|
|
|
|
|
|
|
|
|
|
CompanyInfrastructureWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
|
|
|
|
|
{
|
|
|
|
|
this->UpdateRailRoadTypes();
|
|
|
|
|
|
|
|
|
|
this->InitNested(desc, window_number);
|
|
|
|
|
this->owner = (Owner)this->window_number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UpdateRailRoadTypes()
|
|
|
|
|
{
|
|
|
|
|
this->railtypes = RAILTYPES_NONE;
|
|
|
|
|
this->roadtypes = ROADTYPES_ROAD; // Road is always available.
|
|
|
|
|
|
|
|
|
|
/* Find the used railtypes. */
|
|
|
|
|
Engine *e;
|
|
|
|
|
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
|
|
|
|
|
if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
|
|
|
|
|
|
|
|
|
|
this->railtypes |= GetRailTypeInfo(e->u.rail.railtype)->introduces_railtypes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Get the date introduced railtypes as well. */
|
|
|
|
|
this->railtypes = AddDateIntroducedRailTypes(this->railtypes, MAX_DAY);
|
|
|
|
|
|
|
|
|
|
/* Tram is only visible when there will be a tram. */
|
|
|
|
|
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
|
|
|
|
if (!HasBit(e->info.climates, _settings_game.game_creation.landscape)) continue;
|
|
|
|
|
if (!HasBit(e->info.misc_flags, EF_ROAD_TRAM)) continue;
|
|
|
|
|
|
|
|
|
|
this->roadtypes |= ROADTYPES_TRAM;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void SetStringParameters(int widget) const
|
|
|
|
|
{
|
|
|
|
|
switch (widget) {
|
|
|
|
|
case CIW_WIDGET_CAPTION:
|
|
|
|
|
SetDParam(0, (CompanyID)this->window_number);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
|
|
|
|
|
{
|
|
|
|
|
const Company *c = Company::Get((CompanyID)this->window_number);
|
|
|
|
|
|
|
|
|
|
switch (widget) {
|
|
|
|
|
case CIW_WIDGET_RAIL_DESC: {
|
|
|
|
|
uint lines = 1;
|
|
|
|
|
|
|
|
|
|
for (RailType rt = RAILTYPE_BEGIN; rt < RAILTYPE_END; rt++) {
|
|
|
|
|
if (HasBit(this->railtypes, rt)) {
|
|
|
|
|
lines++;
|
|
|
|
|
SetDParam(0, GetRailTypeInfo(rt)->strings.name);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_WHITE_STRING).width + WD_FRAMERECT_LEFT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (this->railtypes != RAILTYPES_NONE) {
|
|
|
|
|
lines++;
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS).width + WD_FRAMERECT_LEFT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size->height = max(size->height, lines * FONT_HEIGHT_NORMAL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_ROAD_DESC: {
|
|
|
|
|
uint lines = 1;
|
|
|
|
|
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) {
|
|
|
|
|
lines++;
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD).width + WD_FRAMERECT_LEFT);
|
|
|
|
|
}
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) {
|
|
|
|
|
lines++;
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY).width + WD_FRAMERECT_LEFT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size->height = max(size->height, lines * FONT_HEIGHT_NORMAL);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_RAIL_COUNT:
|
|
|
|
|
case CIW_WIDGET_ROAD_COUNT:
|
|
|
|
|
case CIW_WIDGET_WATER_COUNT:
|
|
|
|
|
case CIW_WIDGET_STATION_COUNT: {
|
|
|
|
|
/* Find the maximum count that is displayed. */
|
|
|
|
|
uint32 max_val = 100000; // Some random number to reserve enough space.
|
|
|
|
|
for (RailType rt = RAILTYPE_BEGIN; rt < RAILTYPE_END; rt++) {
|
|
|
|
|
max_val = max(max_val, c->infrastructure.rail[rt]);
|
|
|
|
|
}
|
|
|
|
|
max_val = max(max_val, c->infrastructure.signal);
|
|
|
|
|
for (RoadType rt = ROADTYPE_BEGIN; rt < ROADTYPE_END; rt++) {
|
|
|
|
|
max_val = max(max_val, c->infrastructure.road[rt]);
|
|
|
|
|
}
|
|
|
|
|
max_val = max(max_val, c->infrastructure.water);
|
|
|
|
|
max_val = max(max_val, c->infrastructure.station);
|
|
|
|
|
max_val = max(max_val, c->infrastructure.airport);
|
|
|
|
|
|
|
|
|
|
SetDParam(0, max_val);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_WHITE_COMMA).width + 15); // Reserve some wiggle room.
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void DrawWidget(const Rect &r, int widget) const
|
|
|
|
|
{
|
|
|
|
|
const Company *c = Company::Get((CompanyID)this->window_number);
|
|
|
|
|
int y = r.top;
|
|
|
|
|
|
|
|
|
|
int offs_left = _current_text_dir == TD_LTR ? WD_FRAMERECT_LEFT : 0;
|
|
|
|
|
int offs_right = _current_text_dir == TD_LTR ? 0 : WD_FRAMERECT_LEFT;
|
|
|
|
|
|
|
|
|
|
switch (widget) {
|
|
|
|
|
case CIW_WIDGET_RAIL_DESC:
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_RAIL_SECT);
|
|
|
|
|
|
|
|
|
|
if (this->railtypes != RAILTYPES_NONE) {
|
|
|
|
|
/* Draw name of each valid railtype. */
|
|
|
|
|
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
|
|
|
|
if (HasBit(this->railtypes, rt)) {
|
|
|
|
|
SetDParam(0, GetRailTypeInfo(rt)->strings.name);
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_SIGNALS);
|
|
|
|
|
} else {
|
|
|
|
|
/* No valid railtype. */
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_RAIL_COUNT:
|
|
|
|
|
/* Draw infrastructure count for each valid railtype. */
|
|
|
|
|
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
|
|
|
|
|
if (HasBit(this->railtypes, rt)) {
|
|
|
|
|
SetDParam(0, c->infrastructure.rail[rt]);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (this->railtypes != RAILTYPES_NONE) {
|
|
|
|
|
SetDParam(0, c->infrastructure.signal);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_ROAD_DESC:
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD_SECT);
|
|
|
|
|
|
|
|
|
|
if (this->roadtypes != ROADTYPES_NONE) {
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_ROAD);
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_TRAMWAY);
|
|
|
|
|
} else {
|
|
|
|
|
/* No valid roadtypes. */
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_ROAD_COUNT:
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_ROAD)) {
|
|
|
|
|
SetDParam(0, c->infrastructure.road[ROADTYPE_ROAD]);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
}
|
|
|
|
|
if (HasBit(this->roadtypes, ROADTYPE_TRAM)) {
|
|
|
|
|
SetDParam(0, c->infrastructure.road[ROADTYPE_TRAM]);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_WATER_DESC:
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_WATER_SECT);
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_CANALS);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_WATER_COUNT:
|
|
|
|
|
SetDParam(0, c->infrastructure.water);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_STATION_DESC:
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_INFRASTRUCTURE_VIEW_STATION_SECT);
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_STATIONS);
|
|
|
|
|
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_COMPANY_INFRASTRUCTURE_VIEW_AIRPORTS);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CIW_WIDGET_STATION_COUNT:
|
|
|
|
|
SetDParam(0, c->infrastructure.station);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
SetDParam(0, c->infrastructure.airport);
|
|
|
|
|
DrawString(r.left, r.right, y += FONT_HEIGHT_NORMAL, STR_WHITE_COMMA);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Some data on this window has become invalid.
|
|
|
|
|
* @param data Information about the changed data.
|
|
|
|
|
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
|
|
|
|
*/
|
|
|
|
|
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
|
|
|
|
|
{
|
|
|
|
|
if (!gui_scope) return;
|
|
|
|
|
|
|
|
|
|
this->UpdateRailRoadTypes();
|
|
|
|
|
this->ReInit();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const WindowDesc _company_infrastructure_desc(
|
|
|
|
|
WDP_AUTO, 0, 0,
|
|
|
|
|
WC_COMPANY_INFRASTRUCTURE, WC_NONE,
|
|
|
|
|
WDF_UNCLICK_BUTTONS,
|
|
|
|
|
_nested_company_infrastructure_widgets, lengthof(_nested_company_infrastructure_widgets)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Open the infrastructure window of a company.
|
|
|
|
|
* @param company Company to show infrastructure of.
|
|
|
|
|
*/
|
|
|
|
|
static void ShowCompanyInfrastructure(CompanyID company)
|
|
|
|
|
{
|
|
|
|
|
if (!Company::IsValidID(company)) return;
|
|
|
|
|
AllocateWindowDescFront<CompanyInfrastructureWindow>(&_company_infrastructure_desc, company);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Names of the widgets of the #CompanyWindow. Keep them in the same order as in the widget array */
|
|
|
|
|
enum CompanyWindowWidgets {
|
|
|
|
|
CW_WIDGET_CAPTION,
|
|
|
|
@ -1616,6 +1906,8 @@ enum CompanyWindowWidgets {
|
|
|
|
|
CW_WIDGET_DESC_VEHICLE,
|
|
|
|
|
CW_WIDGET_DESC_VEHICLE_COUNTS,
|
|
|
|
|
CW_WIDGET_DESC_COMPANY_VALUE,
|
|
|
|
|
CW_WIDGET_DESC_INFRASTRUCTURE,
|
|
|
|
|
CW_WIDGET_DESC_INFRASTRUCTURE_COUNTS,
|
|
|
|
|
CW_WIDGET_DESC_OWNERS,
|
|
|
|
|
|
|
|
|
|
CW_WIDGET_SELECT_BUTTONS, ///< Selection widget for the button bar.
|
|
|
|
@ -1633,6 +1925,8 @@ enum CompanyWindowWidgets {
|
|
|
|
|
CW_WIDGET_SELECT_RELOCATE, ///< View/hide the 'Relocate HQ' button.
|
|
|
|
|
CW_WIDGET_RELOCATE_HQ,
|
|
|
|
|
|
|
|
|
|
CW_WIDGET_VIEW_INFRASTRUCTURE,
|
|
|
|
|
|
|
|
|
|
CW_WIDGET_HAS_PASSWORD, ///< Draw a lock when the company has a password
|
|
|
|
|
CW_WIDGET_SELECT_MULTIPLAYER, ///< Multiplayer selection panel.
|
|
|
|
|
CW_WIDGET_COMPANY_PASSWORD,
|
|
|
|
@ -1683,6 +1977,19 @@ static const NWidgetPart _nested_company_widgets[] = {
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(WWT_TEXT, COLOUR_GREY, CW_WIDGET_DESC_COMPANY_VALUE), SetDataTip(STR_COMPANY_VIEW_COMPANY_VALUE, STR_NULL), SetFill(1, 0),
|
|
|
|
|
NWidget(NWID_VERTICAL), SetPIP(4, 2, 4),
|
|
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0),
|
|
|
|
|
NWidget(NWID_VERTICAL),
|
|
|
|
|
NWidget(WWT_TEXT, COLOUR_GREY, CW_WIDGET_DESC_INFRASTRUCTURE), SetDataTip(STR_COMPANY_VIEW_INFRASTRUCTURE, STR_NULL),
|
|
|
|
|
NWidget(NWID_SPACER), SetFill(0, 1),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(WWT_EMPTY, INVALID_COLOUR, CW_WIDGET_DESC_INFRASTRUCTURE_COUNTS), SetMinimalTextLines(5, 0), SetFill(1, 0),
|
|
|
|
|
NWidget(NWID_VERTICAL),
|
|
|
|
|
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CW_WIDGET_VIEW_INFRASTRUCTURE), SetDataTip(STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON, STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP),
|
|
|
|
|
NWidget(NWID_SPACER), SetFill(0, 1), SetMinimalSize(90, 0),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
EndContainer(),
|
|
|
|
|
NWidget(NWID_HORIZONTAL),
|
|
|
|
|
NWidget(NWID_VERTICAL), SetPIP(5, 5, 4),
|
|
|
|
|
NWidget(WWT_EMPTY, INVALID_COLOUR, CW_WIDGET_DESC_OWNERS), SetMinimalTextLines(3, 0),
|
|
|
|
@ -1857,6 +2164,16 @@ struct CompanyWindow : Window
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_DESC_INFRASTRUCTURE_COUNTS:
|
|
|
|
|
SetDParam(0, UINT_MAX);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL).width);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD).width);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_WATER).width);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_STATION).width);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT).width);
|
|
|
|
|
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_NONE).width);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_DESC_OWNERS: {
|
|
|
|
|
const Company *c2;
|
|
|
|
|
|
|
|
|
@ -1922,6 +2239,47 @@ struct CompanyWindow : Window
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_DESC_INFRASTRUCTURE_COUNTS: {
|
|
|
|
|
uint y = r.top;
|
|
|
|
|
|
|
|
|
|
/* Collect rail and road counts. */
|
|
|
|
|
uint rail_pices = c->infrastructure.signal;
|
|
|
|
|
uint road_pieces = 0;
|
|
|
|
|
for (uint i = 0; i < lengthof(c->infrastructure.rail); i++) rail_pices += c->infrastructure.rail[i];
|
|
|
|
|
for (uint i = 0; i < lengthof(c->infrastructure.road); i++) road_pieces += c->infrastructure.road[i];
|
|
|
|
|
|
|
|
|
|
if (rail_pices == 0 && road_pieces == 0 && c->infrastructure.water == 0 && c->infrastructure.station == 0 && c->infrastructure.airport == 0) {
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_NONE);
|
|
|
|
|
} else {
|
|
|
|
|
if (rail_pices != 0) {
|
|
|
|
|
SetDParam(0, rail_pices);
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL);
|
|
|
|
|
y += FONT_HEIGHT_NORMAL;
|
|
|
|
|
}
|
|
|
|
|
if (road_pieces != 0) {
|
|
|
|
|
SetDParam(0, road_pieces);
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD);
|
|
|
|
|
y += FONT_HEIGHT_NORMAL;
|
|
|
|
|
}
|
|
|
|
|
if (c->infrastructure.water != 0) {
|
|
|
|
|
SetDParam(0, c->infrastructure.water);
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_WATER);
|
|
|
|
|
y += FONT_HEIGHT_NORMAL;
|
|
|
|
|
}
|
|
|
|
|
if (c->infrastructure.station != 0) {
|
|
|
|
|
SetDParam(0, c->infrastructure.station);
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_STATION);
|
|
|
|
|
y += FONT_HEIGHT_NORMAL;
|
|
|
|
|
}
|
|
|
|
|
if (c->infrastructure.airport != 0) {
|
|
|
|
|
SetDParam(0, c->infrastructure.airport);
|
|
|
|
|
DrawString(r.left, r.right, y, STR_COMPANY_VIEW_INFRASTRUCTURE_AIRPORT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_DESC_OWNERS: {
|
|
|
|
|
const Company *c2;
|
|
|
|
|
uint y = r.top;
|
|
|
|
@ -2024,6 +2382,10 @@ struct CompanyWindow : Window
|
|
|
|
|
this->SetWidgetDirty(CW_WIDGET_RELOCATE_HQ);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_VIEW_INFRASTRUCTURE:
|
|
|
|
|
ShowCompanyInfrastructure((CompanyID)this->window_number);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case CW_WIDGET_BUY_SHARE:
|
|
|
|
|
DoCommandP(0, this->window_number, 0, CMD_BUY_SHARE_IN_COMPANY | CMD_MSG(STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS));
|
|
|
|
|
break;
|
|
|
|
@ -2117,6 +2479,17 @@ void ShowCompany(CompanyID company)
|
|
|
|
|
AllocateWindowDescFront<CompanyWindow>(&_company_desc, company);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Redraw all windows with company infrastructure counts.
|
|
|
|
|
* @param company The company to redraw the windows of.
|
|
|
|
|
*/
|
|
|
|
|
void DirtyCompanyInfrastructureWindows(CompanyID company)
|
|
|
|
|
{
|
|
|
|
|
SetWindowDirty(WC_COMPANY, company);
|
|
|
|
|
SetWindowDirty(WC_COMPANY_INFRASTRUCTURE, company);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** widget numbers of the #BuyCompanyWindow. */
|
|
|
|
|
enum BuyCompanyWidgets {
|
|
|
|
|
BCW_CAPTION,
|
|
|
|
|