Leverage more historical data in Finances window.

This adds a horizontal scrollbar to the summary page.
This commit is contained in:
Aaron van Geffen 2018-03-12 18:33:04 +01:00
parent 6cdcda2c65
commit df6a86d9bf
2 changed files with 101 additions and 49 deletions

View File

@ -1,5 +1,6 @@
0.1.3 (in development) 0.1.3 (in development)
------------------------------------------------------------------------ ------------------------------------------------------------------------
- Feature: [#7267] Leverage more historical data in Finances window.
0.1.2 (2018-03-18) 0.1.2 (2018-03-18)
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@ -51,7 +51,8 @@ enum
WIDX_TAB_5, WIDX_TAB_5,
WIDX_TAB_6, WIDX_TAB_6,
WIDX_LOAN = 10, WIDX_SUMMARY_SCROLL = 10,
WIDX_LOAN,
WIDX_LOAN_INCREASE, WIDX_LOAN_INCREASE,
WIDX_LOAN_DECREASE, WIDX_LOAN_DECREASE,
@ -87,14 +88,15 @@ enum
static rct_widget _windowFinancesSummaryWidgets[] = static rct_widget _windowFinancesSummaryWidgets[] =
{ {
{ WWT_FRAME, 0, 0, 529, 0, 288, 0xFFFFFFFF, STR_NONE }, \ { WWT_FRAME, 0, 0, 529, 0, 309, 0xFFFFFFFF, STR_NONE }, \
{ WWT_CAPTION, 0, 1, 528, 1, 14, STR_FINANCIAL_SUMMARY, STR_WINDOW_TITLE_TIP }, \ { WWT_CAPTION, 0, 1, 528, 1, 14, STR_FINANCIAL_SUMMARY, STR_WINDOW_TITLE_TIP }, \
{ WWT_CLOSEBOX, 0, 517, 527, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, \ { WWT_CLOSEBOX, 0, 517, 527, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, \
{ WWT_RESIZE, 1, 0, 529, 43, 288, 0xFFFFFFFF, STR_NONE }, \ { WWT_RESIZE, 1, 0, 529, 43, 309, 0xFFFFFFFF, STR_NONE }, \
TAB_WIDGETS, TAB_WIDGETS,
{ WWT_SPINNER, 1, 64, 153, 259, 270, STR_FINANCES_SUMMARY_LOAN_VALUE, STR_NONE }, { WWT_SCROLL, 1, 130, 520, 50, 260, SCROLL_HORIZONTAL, STR_NONE },
{ WWT_BUTTON, 1, 142, 152, 260, 264, STR_NUMERIC_UP, STR_NONE }, { WWT_SPINNER, 1, 64, 153, 279, 290, STR_FINANCES_SUMMARY_LOAN_VALUE, STR_NONE },
{ WWT_BUTTON, 1, 142, 152, 265, 269, STR_NUMERIC_DOWN, STR_NONE }, { WWT_BUTTON, 1, 142, 152, 280, 284, STR_NUMERIC_UP, STR_NONE },
{ WWT_BUTTON, 1, 142, 152, 285, 289, STR_NUMERIC_DOWN, STR_NONE },
{ WIDGETS_END }, { WIDGETS_END },
}; };
@ -183,9 +185,12 @@ static rct_widget *_windowFinancesPageWidgets[] =
static void window_finances_summary_mouseup(rct_window *w, rct_widgetindex widgetIndex); static void window_finances_summary_mouseup(rct_window *w, rct_widgetindex widgetIndex);
static void window_finances_summary_mousedown(rct_window *w, rct_widgetindex widgetIndex, rct_widget* widget); static void window_finances_summary_mousedown(rct_window *w, rct_widgetindex widgetIndex, rct_widget* widget);
static void window_finances_summary_scrollgetsize(rct_window *w, sint32 scrollIndex, sint32 *width, sint32 *height);
static void window_finances_summary_invertscroll(rct_window *w);
static void window_finances_summary_update(rct_window *w); static void window_finances_summary_update(rct_window *w);
static void window_finances_summary_invalidate(rct_window *w); static void window_finances_summary_invalidate(rct_window *w);
static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi);
static void window_finances_summary_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex);
static void window_finances_financial_graph_mouseup(rct_window *w, rct_widgetindex widgetIndex); static void window_finances_financial_graph_mouseup(rct_window *w, rct_widgetindex widgetIndex);
static void window_finances_financial_graph_update(rct_window *w); static void window_finances_financial_graph_update(rct_window *w);
@ -232,7 +237,7 @@ static rct_window_event_list _windowFinancesSummaryEvents =
nullptr, nullptr,
nullptr, nullptr,
nullptr, nullptr,
nullptr, window_finances_summary_scrollgetsize,
nullptr, nullptr,
nullptr, nullptr,
nullptr, nullptr,
@ -244,7 +249,7 @@ static rct_window_event_list _windowFinancesSummaryEvents =
nullptr, nullptr,
window_finances_summary_invalidate, window_finances_summary_invalidate,
window_finances_summary_paint, window_finances_summary_paint,
nullptr window_finances_summary_scrollpaint
}; };
// 0x00988F28 // 0x00988F28
@ -438,6 +443,7 @@ static rct_window_event_list *const _windowFinancesPageEvents[] =
static constexpr const uint32 WindowFinancesPageEnabledWidgets[] = static constexpr const uint32 WindowFinancesPageEnabledWidgets[] =
{ {
ALWAYS_ENABLED_WIDGETS | ALWAYS_ENABLED_WIDGETS |
(1ULL << WIDX_SUMMARY_SCROLL) |
(1ULL << WIDX_LOAN_INCREASE) | (1ULL << WIDX_LOAN_INCREASE) |
(1ULL << WIDX_LOAN_DECREASE), (1ULL << WIDX_LOAN_DECREASE),
@ -486,6 +492,8 @@ static constexpr const sint32 WindowFinancesTabAnimationLoops[] =
16, 32, 32, 32, 38, 16 16, 32, 32, 32, 38, 16
}; };
static constexpr const sint32 EXPENDITURE_COLUMN_WIDTH = 80;
static constexpr const rct_string_id window_finances_summary_row_labels[RCT_EXPENDITURE_TYPE_COUNT] = { static constexpr const rct_string_id window_finances_summary_row_labels[RCT_EXPENDITURE_TYPE_COUNT] = {
STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION, STR_FINANCES_SUMMARY_RIDE_CONSTRUCTION,
STR_FINANCES_SUMMARY_RIDE_RUNNING_COSTS, STR_FINANCES_SUMMARY_RIDE_RUNNING_COSTS,
@ -517,7 +525,7 @@ rct_window * window_finances_open()
w = window_bring_to_front_by_class(WC_FINANCES); w = window_bring_to_front_by_class(WC_FINANCES);
if (w == nullptr) { if (w == nullptr) {
w = window_create_auto_pos(530, 290, _windowFinancesPageEvents[0], WC_FINANCES, WF_10); w = window_create_auto_pos(530, 310, _windowFinancesPageEvents[0], WC_FINANCES, WF_10);
w->number = 0; w->number = 0;
w->frame_no = 0; w->frame_no = 0;
@ -527,7 +535,7 @@ rct_window * window_finances_open()
w->page = WINDOW_FINANCES_PAGE_SUMMARY; w->page = WINDOW_FINANCES_PAGE_SUMMARY;
window_invalidate(w); window_invalidate(w);
w->width = 530; w->width = 530;
w->height = 290; w->height = 310;
window_invalidate(w); window_invalidate(w);
w->widgets = _windowFinancesPageWidgets[WINDOW_FINANCES_PAGE_SUMMARY]; w->widgets = _windowFinancesPageWidgets[WINDOW_FINANCES_PAGE_SUMMARY];
@ -536,8 +544,12 @@ rct_window * window_finances_open()
w->event_handlers = _windowFinancesPageEvents[WINDOW_FINANCES_PAGE_SUMMARY]; w->event_handlers = _windowFinancesPageEvents[WINDOW_FINANCES_PAGE_SUMMARY];
w->pressed_widgets = 0; w->pressed_widgets = 0;
w->disabled_widgets = 0; w->disabled_widgets = 0;
window_init_scroll_widgets(w); window_init_scroll_widgets(w);
// Scroll summary all the way to the right, initially.
window_finances_summary_invertscroll(w);
return w; return w;
} }
@ -595,6 +607,23 @@ static void window_finances_summary_mousedown(rct_window *w, rct_widgetindex wid
} }
} }
static uint16 summary_num_months_available()
{
return std::min<uint16>(gDateMonthsElapsed, EXPENDITURE_TABLE_MONTH_COUNT);
}
static void window_finances_summary_scrollgetsize(rct_window *w, sint32 scrollIndex, sint32 *width, sint32 *height)
{
*width = EXPENDITURE_COLUMN_WIDTH * (summary_num_months_available() + 1);
}
static void window_finances_summary_invertscroll(rct_window *w)
{
rct_widget summary = w->widgets[WIDX_SUMMARY_SCROLL];
w->scrolls[0].h_left = std::max(0, w->scrolls[0].h_right - ((summary.right - summary.left) - 2));
widget_scroll_update_thumbs(w, WIDX_SUMMARY_SCROLL);
}
/** /**
* *
* rct2: 0x0069CBA6 * rct2: 0x0069CBA6
@ -628,33 +657,74 @@ static void window_finances_summary_invalidate(rct_window *w)
*/ */
static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi) static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi)
{ {
sint32 i, j, x, y;
window_draw_widgets(w, dpi); window_draw_widgets(w, dpi);
window_finances_draw_tab_images(dpi, w); window_finances_draw_tab_images(dpi, w);
x = w->x + 8; sint32 x = w->x + 8;
y = w->y + 51; sint32 y = w->y + 51;
// Expenditure / Income heading // Expenditure / Income heading
draw_string_left_underline(dpi, STR_FINANCES_SUMMARY_EXPENDITURE_INCOME, nullptr, COLOUR_BLACK, x, y); draw_string_left_underline(dpi, STR_FINANCES_SUMMARY_EXPENDITURE_INCOME, nullptr, COLOUR_BLACK, x, y);
y += 14; y += 14;
// Expenditure / Income row labels // Expenditure / Income row labels
for (i = 0; i < RCT_EXPENDITURE_TYPE_COUNT; i++) { for (sint32 i = 0; i < RCT_EXPENDITURE_TYPE_COUNT; i++)
{
// Darken every even row // Darken every even row
if (i % 2 == 0) if (i % 2 == 0)
gfx_fill_rect(dpi, x, y - 1, x + 513 - 2, y + (TABLE_CELL_HEIGHT - 2), ColourMapA[w->colours[1]].lighter | 0x1000000); gfx_fill_rect(dpi, x, y - 1, x + 121, y + (TABLE_CELL_HEIGHT - 2), ColourMapA[w->colours[1]].lighter | 0x1000000);
gfx_draw_string_left(dpi, window_finances_summary_row_labels[i], nullptr, COLOUR_BLACK, x, y - 1); gfx_draw_string_left(dpi, window_finances_summary_row_labels[i], nullptr, COLOUR_BLACK, x, y - 1);
y += TABLE_CELL_HEIGHT; y += TABLE_CELL_HEIGHT;
} }
// Horizontal rule below expenditure / income table
gfx_fill_rect_inset(dpi, w->x + 8, w->y + 272, w->x + 8 + 513, w->y + 272 + 1, w->colours[1], INSET_RECT_FLAG_BORDER_INSET);
// Loan and interest rate
gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_LOAN, nullptr, COLOUR_BLACK, w->x + 8, w->y + 279);
set_format_arg(0, uint16, gBankLoanInterestRate);
gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_AT_X_PER_YEAR, gCommonFormatArgs, COLOUR_BLACK, w->x + 160, w->y + 279);
// Current cash
rct_string_id stringId = gCash >= 0 ? STR_CASH_LABEL : STR_CASH_NEGATIVE_LABEL;
gfx_draw_string_left(dpi, stringId, &gCash, COLOUR_BLACK, w->x + 8, w->y + 294);
// Objective related financial information
if (gScenarioObjectiveType == OBJECTIVE_MONTHLY_FOOD_INCOME) {
money32 lastMonthProfit = finance_get_last_month_shop_profit();
set_format_arg(0, money32, lastMonthProfit);
gfx_draw_string_left(dpi, STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL, gCommonFormatArgs, COLOUR_BLACK, w->x + 280, w->y + 279);
} else {
// Park value and company value
gfx_draw_string_left(dpi, STR_PARK_VALUE_LABEL, &gParkValue, COLOUR_BLACK, w->x + 280, w->y + 279);
gfx_draw_string_left(dpi, STR_COMPANY_VALUE_LABEL, &gCompanyValue, COLOUR_BLACK, w->x + 280, w->y + 294);
}
}
static void window_finances_summary_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex)
{
sint32 x = 0;
sint32 y = TABLE_CELL_HEIGHT + 2;
rct_widget self = w->widgets[WIDX_SUMMARY_SCROLL];
sint32 row_width = std::max<uint16>(w->scrolls[0].h_right, self.right - self.left);
// Expenditure / Income row labels
for (sint32 i = 0; i < RCT_EXPENDITURE_TYPE_COUNT; i++)
{
// Darken every even row
if (i % 2 == 0)
gfx_fill_rect(dpi, x, y - 1, x + row_width, y + (TABLE_CELL_HEIGHT - 2), ColourMapA[w->colours[1]].lighter | 0x1000000);
y += TABLE_CELL_HEIGHT;
}
// Expenditure / Income values for each month // Expenditure / Income values for each month
x = w->x + 118;
sint16 currentMonthYear = gDateMonthsElapsed; sint16 currentMonthYear = gDateMonthsElapsed;
for (i = 4; i >= 0; i--) { for (sint32 i = summary_num_months_available(); i >= 0; i--)
y = w->y + 51; {
y = 0;
sint16 monthyear = currentMonthYear - i; sint16 monthyear = currentMonthYear - i;
if (monthyear < 0) if (monthyear < 0)
@ -668,14 +738,14 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi)
monthyear == currentMonthYear ? STR_WINDOW_COLOUR_2_STRINGID : STR_BLACK_STRING, monthyear == currentMonthYear ? STR_WINDOW_COLOUR_2_STRINGID : STR_BLACK_STRING,
gCommonFormatArgs, gCommonFormatArgs,
COLOUR_BLACK, COLOUR_BLACK,
x + 80, x + EXPENDITURE_COLUMN_WIDTH,
y y
); );
y += 14; y += 14;
// Month expenditures // Month expenditures
money32 profit = 0; money32 profit = 0;
for (j = 0; j < RCT_EXPENDITURE_TYPE_COUNT; j++) for (sint32 j = 0; j < RCT_EXPENDITURE_TYPE_COUNT; j++)
{ {
money32 expenditure = gExpenditureTable[i][j]; money32 expenditure = gExpenditureTable[i][j];
if (expenditure != 0) if (expenditure != 0)
@ -686,7 +756,7 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi)
expenditure >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_EXPENDITURE_VALUE, expenditure >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_EXPENDITURE_VALUE,
&expenditure, &expenditure,
COLOUR_BLACK, COLOUR_BLACK,
x + 80, x + EXPENDITURE_COLUMN_WIDTH,
y y
); );
} }
@ -700,35 +770,12 @@ static void window_finances_summary_paint(rct_window *w, rct_drawpixelinfo *dpi)
profit >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_LOSS_VALUE, profit >= 0 ? STR_FINANCES_SUMMARY_INCOME_VALUE : STR_FINANCES_SUMMARY_LOSS_VALUE,
&profit, &profit,
COLOUR_BLACK, COLOUR_BLACK,
x + 80, x + EXPENDITURE_COLUMN_WIDTH,
y y
); );
gfx_fill_rect(dpi, x + 10, y - 2, x + 10 + 70, y - 2, PALETTE_INDEX_10); gfx_fill_rect(dpi, x + 10, y - 2, x + EXPENDITURE_COLUMN_WIDTH, y - 2, PALETTE_INDEX_10);
x += 80; x += EXPENDITURE_COLUMN_WIDTH;
}
// Horizontal rule below expenditure / income table
gfx_fill_rect_inset(dpi, w->x + 8, w->y + 252, w->x + 8 + 513, w->y + 252 + 1, w->colours[1], INSET_RECT_FLAG_BORDER_INSET);
// Loan and interest rate
gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_LOAN, nullptr, COLOUR_BLACK, w->x + 8, w->y + 259);
set_format_arg(0, uint16, gBankLoanInterestRate);
gfx_draw_string_left(dpi, STR_FINANCES_SUMMARY_AT_X_PER_YEAR, gCommonFormatArgs, COLOUR_BLACK, w->x + 160, w->y + 259);
// Current cash
rct_string_id stringId = gCash >= 0 ? STR_CASH_LABEL : STR_CASH_NEGATIVE_LABEL;
gfx_draw_string_left(dpi, stringId, &gCash, COLOUR_BLACK, w->x + 8, w->y + 274);
// Objective related financial information
if (gScenarioObjectiveType == OBJECTIVE_MONTHLY_FOOD_INCOME) {
money32 lastMonthProfit = finance_get_last_month_shop_profit();
set_format_arg(0, money32, lastMonthProfit);
gfx_draw_string_left(dpi, STR_LAST_MONTH_PROFIT_FROM_FOOD_DRINK_MERCHANDISE_SALES_LABEL, gCommonFormatArgs, COLOUR_BLACK, w->x + 280, w->y + 259);
} else {
// Park value and company value
gfx_draw_string_left(dpi, STR_PARK_VALUE_LABEL, &gParkValue, COLOUR_BLACK, w->x + 280, w->y + 259);
gfx_draw_string_left(dpi, STR_COMPANY_VALUE_LABEL, &gCompanyValue, COLOUR_BLACK, w->x + 280, w->y + 274);
} }
} }
@ -1375,7 +1422,7 @@ static void window_finances_set_page(rct_window *w, sint32 page)
w->height = 207; w->height = 207;
} else if (w->page == WINDOW_FINANCES_PAGE_SUMMARY) { } else if (w->page == WINDOW_FINANCES_PAGE_SUMMARY) {
w->width = 530; w->width = 530;
w->height = 290; w->height = 310;
} else { } else {
w->width = 530; w->width = 530;
w->height = 257; w->height = 257;
@ -1385,6 +1432,10 @@ static void window_finances_set_page(rct_window *w, sint32 page)
window_init_scroll_widgets(w); window_init_scroll_widgets(w);
window_invalidate(w); window_invalidate(w);
// Scroll summary all the way to the right, initially.
if (w->page == WINDOW_FINANCES_PAGE_SUMMARY)
window_finances_summary_invertscroll(w);
} }
static void window_finances_set_pressed_tab(rct_window *w) static void window_finances_set_pressed_tab(rct_window *w)