(svn r17756) -Codechange: Company finances window uses pure nested widgets.

pull/155/head
alberth 15 years ago
parent 2592a45e4c
commit 16bc6380a8

@ -40,7 +40,6 @@ enum {
EXP_BLOCKSPACE = 10, ///< Amount of vertical space between two blocks of numbers.
};
static void DoShowCompanyFinances(CompanyID company, bool show_small, bool show_stickied, int top = FIRST_GUI_CALL, int left = FIRST_GUI_CALL);
static void DoSelectCompanyManagerFace(Window *parent, bool show_big, int top = FIRST_GUI_CALL, int left = FIRST_GUI_CALL);
/** Standard unsorted list of expenses. */
@ -92,9 +91,27 @@ struct ExpensesList {
uint GetHeight() const
{
/* top spacing + heading + line + texts of expenses + sub-totals + total line + total text + bottom spacing. */
return WD_FRAMERECT_TOP + FONT_HEIGHT_NORMAL + EXP_LINESPACE +
this->length * FONT_HEIGHT_NORMAL + num_subtotals * (EXP_BLOCKSPACE + EXP_LINESPACE) + EXP_LINESPACE + FONT_HEIGHT_NORMAL + WD_FRAMERECT_BOTTOM;
/* heading + line + texts of expenses + sub-totals + total line + total text */
return FONT_HEIGHT_NORMAL + EXP_LINESPACE + this->length * FONT_HEIGHT_NORMAL + num_subtotals * (EXP_BLOCKSPACE + EXP_LINESPACE) + EXP_LINESPACE + FONT_HEIGHT_NORMAL;
}
/** Compute width of the expenses categories in pixels. */
uint GetCategoriesWidth() const
{
uint width = 0;
bool invalid_expenses_measured = false; // Measure 'Total' width only once.
for (uint i = 0; i < this->length; i++) {
ExpensesType et = this->et[i];
if (et == INVALID_EXPENSES) {
if (!invalid_expenses_measured) {
width = max(width, GetStringBoundingBox(STR_FINANCES_TOTAL_CAPTION).width);
invalid_expenses_measured = true;
}
} else {
width = max(width, GetStringBoundingBox(STR_FINANCES_SECTION_CONSTRUCTION + et).width);
}
}
return width;
}
};
@ -110,14 +127,22 @@ enum CompanyFinancesWindowWidgets {
CFW_TOGGLE_SIZE, ///< Toggle windows size
CFW_STICKY, ///< Sticky button
CFW_EXPS_PANEL, ///< Panel for expenses
CFW_SEL_PANEL, ///< Select panel or nothing
CFW_EXPS_CATEGORY, ///< Column for expenses category strings
CFW_EXPS_PRICE1, ///< Column for year Y-2 expenses
CFW_EXPS_PRICE2, ///< Column for year Y-1 expenses
CFW_EXPS_PRICE3, ///< Column for year Y expenses
CFW_TOTAL_PANEL, ///< Panel for totals
CFW_TOTAL_LABELS, ///< Column for totals labels
CFW_TOTAL_VALUES, ///< Column for totals values
CFW_TOTAL_MAXLOAN, ///< Column for max loan string
CFW_SEL_MAXLOAN, ///< Selection of maxloan column
CFW_BALANCE_TITLE, ///< 'Bank balance' title
CFW_LOAN_TITLE, ///< 'Loan' title
CFW_BALANCE_VALUE, ///< Bank balance value
CFW_LOAN_VALUE, ///< Loan
CFW_LOAN_LINE, ///< Line for summing bank balance and loan
CFW_TOTAL_VALUE, ///< Total
CFW_MAXLOAN_GAP, ///< Gap above max loan widget
CFW_MAXLOAN_VALUE, ///< Max loan widget
CFW_SEL_BUTTONS, ///< Selection of buttons
CFW_INCREASE_LOAN, ///< Increase loan
CFW_REPAY_LOAN, ///< Decrease loan
};
@ -126,9 +151,9 @@ enum CompanyFinancesWindowWidgets {
* @param r Available space for drawing.
* @note The environment must provide padding at the left and right of \a r.
*/
static int DrawCategories(const Rect &r)
static void DrawCategories(const Rect &r)
{
int y = r.top + WD_FRAMERECT_TOP;
int y = r.top;
DrawString(r.left, r.right, y, STR_FINANCES_EXPENDITURE_INCOME_TITLE, TC_FROMSTRING, SA_CENTER, true);
y += FONT_HEIGHT_NORMAL + EXP_LINESPACE;
@ -147,7 +172,6 @@ static int DrawCategories(const Rect &r)
}
DrawString(r.left, r.right, y + EXP_LINESPACE, STR_FINANCES_TOTAL_CAPTION, TC_FROMSTRING, SA_RIGHT);
return y;
}
/** Draw an amount of money.
@ -175,7 +199,7 @@ static void DrawPrice(Money amount, int left, int right, int top)
*/
static void DrawYearColumn(const Rect &r, int year, const Money (*tbl)[EXPENSES_END])
{
int y = r.top + WD_FRAMERECT_TOP;
int y = r.top;
SetDParam(0, year);
DrawString(r.left, r.right, y, STR_FINANCES_YEAR, TC_FROMSTRING, SA_RIGHT, true);
@ -207,236 +231,220 @@ static void DrawYearColumn(const Rect &r, int year, const Money (*tbl)[EXPENSES_
DrawPrice(sum, r.left, r.right, y);
}
static void DrawCompanyEconomyStats(const Company *c, bool small, const Widget *widget)
{
int y;
if (!small) { // normal sized economics window
const Widget *w = &widget[CFW_EXPS_CATEGORY];
const Rect r = {w->left + WD_FRAMERECT_LEFT, 14, w->right - WD_FRAMERECT_RIGHT, w->bottom};
y = DrawCategories(r);
/* draw the price columns */
int year = _cur_year - 2;
w++;
const Money (*tbl)[EXPENSES_END] = c->yearly_expenses + 2;
for (int j = 0; j < 3; j++) {
if (year >= c->inaugurated_year) {
const Rect r = {w->left, 14, w->right, w->bottom};
DrawYearColumn(r, year, tbl);
w++;
}
year++;
tbl--;
}
y += 14;
/* draw max loan aligned to loan below (y += 10) */
SetDParam(0, _economy.max_loan);
DrawString(widget[CFW_TOTAL_MAXLOAN].left, widget[CFW_TOTAL_MAXLOAN].right, y + 10, STR_FINANCES_MAX_LOAN);
} else {
y = 15;
}
DrawString(widget[CFW_TOTAL_LABELS].left, widget[CFW_TOTAL_LABELS].right, y, STR_FINANCES_BANK_BALANCE_TITLE);
SetDParam(0, c->money);
DrawString(widget[CFW_TOTAL_VALUES].left, widget[CFW_TOTAL_VALUES].right, y, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
y += 10;
DrawString(widget[CFW_TOTAL_LABELS].left, widget[CFW_TOTAL_LABELS].right, y, STR_FINANCES_LOAN_TITLE);
SetDParam(0, c->current_loan);
DrawString(widget[CFW_TOTAL_VALUES].left, widget[CFW_TOTAL_VALUES].right, y, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
y += 12;
GfxFillRect(widget[CFW_TOTAL_VALUES].left, y - 2, widget[CFW_TOTAL_VALUES].right, y - 2, 215);
SetDParam(0, c->money - c->current_loan);
DrawString(widget[CFW_TOTAL_VALUES].left, widget[CFW_TOTAL_VALUES].right, y, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
}
static const NWidgetPart _nested_company_finances_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY, CFW_CLOSEBOX),
NWidget(WWT_CAPTION, COLOUR_GREY, CFW_CAPTION), SetMinimalSize(369, 14), SetDataTip(STR_FINANCES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_IMGBTN, COLOUR_GREY, CFW_TOGGLE_SIZE), SetMinimalSize(14, 14), SetDataTip(SPR_LARGE_SMALL_WINDOW, STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW),
NWidget(WWT_STICKYBOX, COLOUR_GREY, CFW_STICKY),
NWidget(WWT_CLOSEBOX, COLOUR_GREY, CFW_CLOSEBOX), SetFill(false, true),
NWidget(WWT_CAPTION, COLOUR_GREY, CFW_CAPTION), SetDataTip(STR_FINANCES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_IMGBTN, COLOUR_GREY, CFW_TOGGLE_SIZE), SetMinimalSize(14, 14), SetFill(false, true), SetDataTip(SPR_LARGE_SMALL_WINDOW, STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW),
NWidget(WWT_STICKYBOX, COLOUR_GREY, CFW_STICKY), SetFill(false, true),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, CFW_EXPS_PANEL),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_CATEGORY), SetMinimalSize(123, 0),
NWidget(NWID_SPACER), SetMinimalSize(7, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE1), SetMinimalSize(86, 0),
NWidget(NWID_SPACER), SetMinimalSize(9, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE2), SetMinimalSize(86, 0),
NWidget(NWID_SPACER), SetMinimalSize(9, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE3), SetMinimalSize(86, 0),
NWidget(NWID_SPACER), SetMinimalSize(1, 0),
NWidget(NWID_SELECTION, INVALID_COLOUR, CFW_SEL_PANEL),
NWidget(WWT_PANEL, COLOUR_GREY, CFW_EXPS_PANEL),
NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetPIP(0, 9, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_CATEGORY), SetMinimalSize(120, 0), SetFill(false, false),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE1), SetMinimalSize(86, 0), SetFill(false, false),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE2), SetMinimalSize(86, 0), SetFill(false, false),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE3), SetMinimalSize(86, 0), SetFill(false, false),
EndContainer(),
EndContainer(),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, CFW_TOTAL_PANEL),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(2, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_LABELS), SetMinimalSize(95, 34),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_VALUES), SetMinimalSize(86, 34),
NWidget(NWID_SPACER), SetMinimalSize(19, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_MAXLOAN), SetMinimalSize(205, 34),
NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT),
NWidget(NWID_VERTICAL), // Vertical column with 'bank balance', 'loan'
NWidget(WWT_TEXT, COLOUR_GREY, CFW_BALANCE_TITLE), SetDataTip(STR_FINANCES_BANK_BALANCE_TITLE, STR_NULL), SetFill(true, false),
NWidget(WWT_TEXT, COLOUR_GREY, CFW_LOAN_TITLE), SetDataTip(STR_FINANCES_LOAN_TITLE, STR_NULL), SetFill(true, false),
NWidget(NWID_SPACER), SetFill(false, true),
EndContainer(),
NWidget(NWID_SPACER), SetFill(false, false), SetMinimalSize(30, 0),
NWidget(NWID_VERTICAL), // Vertical column with bank balance amount, loan amount, and total.
NWidget(WWT_TEXT, COLOUR_GREY, CFW_BALANCE_VALUE), SetDataTip(STR_NULL, STR_NULL),
NWidget(WWT_TEXT, COLOUR_GREY, CFW_LOAN_VALUE), SetDataTip(STR_NULL, STR_NULL),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_LOAN_LINE), SetMinimalSize(0, 2), SetFill(true, false),
NWidget(WWT_TEXT, COLOUR_GREY, CFW_TOTAL_VALUE), SetDataTip(STR_NULL, STR_NULL),
EndContainer(),
NWidget(NWID_SELECTION, INVALID_COLOUR, CFW_SEL_MAXLOAN),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetFill(false, true), SetMinimalSize(25, 0),
NWidget(NWID_VERTICAL), // Max loan information
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_MAXLOAN_GAP), SetFill(false, false),
NWidget(WWT_TEXT, COLOUR_GREY, CFW_MAXLOAN_VALUE), SetDataTip(STR_FINANCES_MAX_LOAN, STR_NULL),
NWidget(NWID_SPACER), SetFill(false, true),
EndContainer(),
EndContainer(),
EndContainer(),
NWidget(NWID_SPACER), SetFill(true, true),
EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_INCREASE_LOAN), SetMinimalSize(203, 12), SetDataTip(STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_REPAY_LOAN), SetMinimalSize(204, 12), SetDataTip(STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP),
EndContainer(),
};
static const Widget _company_finances_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // CFW_CLOSEBOX
{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 380, 0, 13, STR_FINANCES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // CFW_CAPTION
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 381, 394, 0, 13, SPR_LARGE_SMALL_WINDOW, STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW}, // CFW_TOGGLE_SIZE
{ WWT_STICKYBOX, RESIZE_NONE, COLOUR_GREY, 395, 406, 0, 13, 0x0, STR_TOOLTIP_STICKY}, // CFW_STICKY
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 406, 14, 14, 0x0, STR_NULL}, // CFW_EXPS_PANEL
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 122, 14, 14, 0x0, STR_NULL}, // CFW_EXPS_CATEGORY
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 130, 215, 14, 14, 0x0, STR_NULL}, // CFW_EXPS_PRICE1
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 225, 310, 14, 14, 0x0, STR_NULL}, // CFW_EXPS_PRICE2
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 320, 405, 14, 14, 0x0, STR_NULL}, // CFW_EXPS_PRICE3
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 406, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_PANEL
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 2, 96, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_LABELS
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 97, 182, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_VALUES
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 202, 406, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_MAXLOAN
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 0, 202, 48, 59, STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP}, // CFW_INCREASE_LOAN
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 203, 406, 48, 59, STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP}, // CFW_REPAY_LOAN
{ WIDGETS_END},
};
static const NWidgetPart _nested_company_finances_small_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY, CFW_CLOSEBOX),
NWidget(WWT_CAPTION, COLOUR_GREY, CFW_CAPTION), SetMinimalSize(243, 14), SetDataTip(STR_FINANCES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_IMGBTN, COLOUR_GREY, CFW_TOGGLE_SIZE), SetMinimalSize(14, 14), SetDataTip(SPR_LARGE_SMALL_WINDOW, STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW),
NWidget(WWT_STICKYBOX, COLOUR_GREY, CFW_STICKY),
EndContainer(),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PANEL),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_CATEGORY),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE1),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE2),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_EXPS_PRICE3),
NWidget(WWT_PANEL, COLOUR_GREY, CFW_TOTAL_PANEL),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_SPACER), SetMinimalSize(2, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_LABELS), SetMinimalSize(95, 34),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_VALUES), SetMinimalSize(86, 34),
NWidget(WWT_EMPTY, COLOUR_GREY, CFW_TOTAL_MAXLOAN), SetMinimalSize(97, 0),
NWidget(NWID_SELECTION, INVALID_COLOUR, CFW_SEL_BUTTONS),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_INCREASE_LOAN), SetFill(true, false), SetDataTip(STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_REPAY_LOAN), SetFill(true, false), SetDataTip(STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP),
EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_INCREASE_LOAN), SetMinimalSize(140, 12), SetDataTip(STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CFW_REPAY_LOAN), SetMinimalSize(140, 12), SetDataTip(STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP),
EndContainer(),
};
static const Widget _company_finances_small_widgets[] = {
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_BLACK_CROSS, STR_TOOLTIP_CLOSE_WINDOW}, // CFW_CLOSEBOX
{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 253, 0, 13, STR_FINANCES_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS}, // CFW_CAPTION
{ WWT_IMGBTN, RESIZE_NONE, COLOUR_GREY, 254, 267, 0, 13, SPR_LARGE_SMALL_WINDOW, STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW}, // CFW_TOGGLE_SIZE
{ WWT_STICKYBOX, RESIZE_NONE, COLOUR_GREY, 268, 279, 0, 13, 0x0, STR_TOOLTIP_STICKY}, // CFW_STICKY
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_EXPS_PANEL
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_EXPS_CATEGORY
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_EXPS_PRICE1
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_EXPS_PRICE2
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_EXPS_PRICE3
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 279, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_PANEL
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 2, 96, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_LABELS
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 97, 182, 14, 47, 0x0, STR_NULL}, // CFW_TOTAL_VALUES
{ WWT_EMPTY, RESIZE_NONE, COLOUR_GREY, 0, 0, 0, 0, 0x0, STR_NULL}, // CFW_TOTAL_MAXLOAN
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 0, 139, 48, 59, STR_FINANCES_BORROW_BUTTON, STR_FINANCES_BORROW_TOOLTIP}, // CFW_INCREASE_LOAN
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 140, 279, 48, 59, STR_FINANCES_REPAY_BUTTON, STR_FINANCES_REPAY_TOOLTIP}, // CFW_REPAY_LOAN
{ WIDGETS_END},
};
/** Window class displaying the company finances.
* @todo #money_width should be calculated dynamically.
*/
struct CompanyFinancesWindow : Window {
bool small;
bool small; ///< Window is toggled to 'small'.
uint money_width; ///< Width needed for displaying all amounts.
CompanyFinancesWindow(const WindowDesc *desc, CompanyID company, bool show_small,
bool show_stickied, int top, int left) :
Window(desc, company),
small(show_small)
CompanyFinancesWindow(const WindowDesc *desc, CompanyID company) : Window()
{
this->small = false;
this->money_width = 86;
this->CreateNestedTree(desc);
this->SetupWidgets();
this->FinishInitNested(desc, company);
this->owner = (Owner)this->window_number;
}
if (show_stickied) this->flags4 |= WF_STICKY;
virtual void SetStringParameters(int widget) const
{
const Company *c = Company::Get((CompanyID)this->window_number);
switch (widget) {
case CFW_CAPTION:
SetDParam(0, c->index);
SetDParam(1, c->index);
break;
/* Check if repositioning from default is required */
if (top != FIRST_GUI_CALL && left != FIRST_GUI_CALL) {
this->top = top;
this->left = left;
case CFW_MAXLOAN_VALUE:
SetDParam(0, _economy.max_loan);
break;
case CFW_INCREASE_LOAN:
case CFW_REPAY_LOAN:
SetDParam(2, LOAN_INTERVAL);
break;
}
}
this->FindWindowPlacementAndResize(desc);
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *resize)
{
int type = _settings_client.gui.expenses_layout;
switch (widget) {
case CFW_EXPS_CATEGORY:
size->width = _expenses_list_types[type].GetCategoriesWidth();
size->height = _expenses_list_types[type].GetHeight();
break;
case CFW_EXPS_PRICE1:
case CFW_EXPS_PRICE2:
case CFW_EXPS_PRICE3:
size->width = this->money_width;
size->height = _expenses_list_types[type].GetHeight();
break;
case CFW_BALANCE_VALUE:
case CFW_LOAN_VALUE:
case CFW_TOTAL_VALUE:
size->width = this->money_width + padding.width;
break;
case CFW_MAXLOAN_GAP:
size->height = FONT_HEIGHT_NORMAL;
break;
}
}
virtual void OnPaint()
virtual void DrawWidget(const Rect &r, int widget) const
{
switch (widget) {
case CFW_EXPS_CATEGORY:
DrawCategories(r);
break;
case CFW_EXPS_PRICE1:
case CFW_EXPS_PRICE2:
case CFW_EXPS_PRICE3: {
const Company *c = Company::Get((CompanyID)this->window_number);
int age = min(_cur_year - c->inaugurated_year, 2);
int wid_offset = widget - CFW_EXPS_PRICE1;
if (wid_offset <= age) {
DrawYearColumn(r, _cur_year - (age - wid_offset), c->yearly_expenses + (age - wid_offset));
}
break;
}
case CFW_BALANCE_VALUE: {
const Company *c = Company::Get((CompanyID)this->window_number);
SetDParam(0, c->money);
DrawString(r.left, r.right, r.top, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
break;
}
case CFW_LOAN_VALUE: {
const Company *c = Company::Get((CompanyID)this->window_number);
SetDParam(0, c->current_loan);
DrawString(r.left, r.right, r.top, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
break;
}
case CFW_TOTAL_VALUE: {
const Company *c = Company::Get((CompanyID)this->window_number);
SetDParam(0, c->money - c->current_loan);
DrawString(r.left, r.right, r.top, STR_FINANCES_TOTAL_CURRENCY, TC_FROMSTRING, SA_RIGHT);
break;
}
case CFW_LOAN_LINE:
GfxFillRect(r.left, r.top, r.right, r.top, 215);
break;
}
}
/** Setup the widgets in the nested tree, such that the finances window is displayed properly.
* @note After setup, the window must be (re-)initialized.
*/
void SetupWidgets()
{
int plane = small ? STACKED_SELECTION_ZERO_SIZE : 0;
this->GetWidget<NWidgetStacked>(CFW_SEL_PANEL)->SetDisplayedPlane(plane);
this->GetWidget<NWidgetStacked>(CFW_SEL_MAXLOAN)->SetDisplayedPlane(plane);
CompanyID company = (CompanyID)this->window_number;
const Company *c = Company::Get(company);
plane = (company != _local_company) ? STACKED_SELECTION_ZERO_SIZE : 0;
this->GetWidget<NWidgetStacked>(CFW_SEL_BUTTONS)->SetDisplayedPlane(plane);
}
virtual void OnPaint()
{
if (!small) {
/* Check that the expenses panel height matches the height needed for the layout. */
int type = _settings_client.gui.expenses_layout;
if (this->widget[CFW_EXPS_PANEL].bottom < this->widget[CFW_EXPS_PANEL].top) {
this->widget[CFW_EXPS_PANEL].bottom = this->widget[CFW_EXPS_PANEL].top;
}
uint height = this->widget[CFW_EXPS_PANEL].bottom - this->widget[CFW_EXPS_PANEL].top + 1;
if (_expenses_list_types[type].GetHeight() != height) {
this->SetDirty();
ResizeWindowForWidget(this, CFW_EXPS_PANEL, 0, _expenses_list_types[type].GetHeight() - height);
this->SetDirty();
if (_expenses_list_types[type].GetHeight() != this->GetWidget<NWidgetCore>(CFW_EXPS_CATEGORY)->current_y) {
this->SetupWidgets();
this->ReInit();
return;
}
}
/* Recheck the size of the window as it might need to be resized due to the local company changing */
int new_height = this->widget[(company == _local_company) ? CFW_INCREASE_LOAN : CFW_TOTAL_PANEL].bottom + 1;
if (this->height != new_height) {
/* Make window dirty before and after resizing */
this->SetDirty();
this->height = new_height;
this->SetDirty();
this->SetWidgetHiddenState(CFW_INCREASE_LOAN, company != _local_company);
this->SetWidgetHiddenState(CFW_REPAY_LOAN, company != _local_company);
/* Check that the loan buttons are shown only when the user owns the company. */
CompanyID company = (CompanyID)this->window_number;
int req_plane = (company != _local_company) ? STACKED_SELECTION_ZERO_SIZE : 0;
if (req_plane != this->GetWidget<NWidgetStacked>(CFW_SEL_BUTTONS)->shown_plane) {
this->SetupWidgets();
this->ReInit();
return;
}
/* Borrow button only shows when there is any more money to loan */
this->SetWidgetDisabledState(CFW_INCREASE_LOAN, c->current_loan == _economy.max_loan);
/* Repay button only shows when there is any more money to repay */
this->SetWidgetDisabledState(CFW_REPAY_LOAN, company != _local_company || c->current_loan == 0);
const Company *c = Company::Get(company);
this->SetWidgetDisabledState(CFW_INCREASE_LOAN, c->current_loan == _economy.max_loan); // Borrow button only shows when there is any more money to loan.
this->SetWidgetDisabledState(CFW_REPAY_LOAN, company != _local_company || c->current_loan == 0); // Repay button only shows when there is any more money to repay.
SetDParam(0, c->index);
SetDParam(1, c->index);
SetDParam(2, LOAN_INTERVAL);
this->DrawWidgets();
DrawCompanyEconomyStats(c, this->small, this->widget);
}
virtual void OnClick(Point pt, int widget)
{
switch (widget) {
case CFW_TOGGLE_SIZE: {// toggle size
bool new_mode = !this->small;
bool stickied = !!(this->flags4 & WF_STICKY);
int oldtop = this->top; ///< current top position of the window before closing it
int oldleft = this->left; ///< current left position of the window before closing it
CompanyID company = (CompanyID)this->window_number;
delete this;
/* Open up the (toggled size) Finance window at the same position as the previous */
DoShowCompanyFinances(company, new_mode, stickied, oldtop, oldleft);
}
break;
case CFW_TOGGLE_SIZE: // toggle size
this->small = !this->small;
this->SetupWidgets();
this->ReInit();
break;
case CFW_INCREASE_LOAN: // increase loan
DoCommandP(0, 0, _ctrl_pressed, CMD_INCREASE_LOAN | CMD_MSG(STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY));
@ -450,41 +458,22 @@ struct CompanyFinancesWindow : Window {
};
static const WindowDesc _company_finances_desc(
WDP_AUTO, WDP_AUTO, 407, 60, 407, 60,
WC_FINANCES, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
_company_finances_widgets, _nested_company_finances_widgets, lengthof(_nested_company_finances_widgets)
);
static const WindowDesc _company_finances_small_desc(
WDP_AUTO, WDP_AUTO, 280, 60, 280, 60,
WDP_AUTO, WDP_AUTO, 0, 0, 0, 0,
WC_FINANCES, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
_company_finances_small_widgets, _nested_company_finances_small_widgets, lengthof(_nested_company_finances_small_widgets)
NULL, _nested_company_finances_widgets, lengthof(_nested_company_finances_widgets)
);
/**
* Open the small/large finance window of the company
*
* @param company the company who's finances are requested to be seen
* @param show_small show large or small version opf the window
* @param show_stickied previous "stickyness" of the window
* @param top previous top position of the window
* @param left previous left position of the window
*
* @pre is company a valid company
/** Open the finances window of a company.
* @param company Company to show finances of.
* @pre is company a valid company.
*/
static void DoShowCompanyFinances(CompanyID company, bool show_small, bool show_stickied, int top, int left)
void ShowCompanyFinances(CompanyID company)
{
if (!Company::IsValidID(company)) return;
if (BringWindowToFrontById(WC_FINANCES, company)) return;
new CompanyFinancesWindow(show_small ? &_company_finances_small_desc : &_company_finances_desc, company, show_small, show_stickied, top, left);
}
void ShowCompanyFinances(CompanyID company)
{
DoShowCompanyFinances(company, false, false);
new CompanyFinancesWindow(&_company_finances_desc, company);
}
/* List of colours for the livery window */

Loading…
Cancel
Save