diff options
-rw-r--r-- | src/graph_gui.cpp | 108 |
1 files changed, 63 insertions, 45 deletions
diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index f123e58ff..c37f9c027 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -713,17 +713,9 @@ void ShowCompanyValueGraph(void) static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_CREATE: { - uint i; - for (i = 3; i < w->widget_count; i++) { - if (!HASBIT(_legend_excluded_cargo, i - 3)) LowerWindowWidget(w, i); - } - break; - } - case WE_PAINT: { int j, x, y; - CargoID i; + uint i = 0; GraphDrawer gd; DrawWindowWidgets(w); @@ -734,34 +726,44 @@ static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) gd.excluded_data = _legend_excluded_cargo; gd.left = 2; gd.top = 24; - gd.height = 104; + gd.height = w->height - 38; gd.has_negative_values = false; gd.format_str_y_axis = STR_CURRCOMPACT; - gd.num_dataset = NUM_CARGO; gd.num_on_x_axis = 20; gd.num_vert_lines = 20; gd.month = 0xFF; gd.x_values_start = 10; gd.x_values_increment = 10; - for (i = 0; i != NUM_CARGO; i++) { - /* Since the buttons have no text, no images, - * both the text and the colored box have to be manually painted. - * clk_dif will move one pixel down and one pixel to the right - * when the button is clicked */ - byte clk_dif = IsWindowWidgetLowered(w, i + 3) ? 1 : 0; - const CargoSpec *cs = GetCargo(i); - - GfxFillRect(x + clk_dif, y + clk_dif, x + 8 + clk_dif, y + 5 + clk_dif, 0); - GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, cs->legend_colour); - SetDParam(0, cs->name != 0 ? cs->name : (StringID)STR_EMPTY); - DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0); - y += 8; + for (CargoID c = 0; c != NUM_CARGO; c++) { + const CargoSpec *cs = GetCargo(c); + if (!cs->IsValid()) continue; + + /* Only draw labels for widgets that exist. If the widget doesn't + * exist then the local player has used the climate cheat or + * changed the NewGRF configuration with this window open. */ + if (i + 3 < w->widget_count) { + /* Since the buttons have no text, no images, + * both the text and the colored box have to be manually painted. + * clk_dif will move one pixel down and one pixel to the right + * when the button is clicked */ + byte clk_dif = IsWindowWidgetLowered(w, i + 3) ? 1 : 0; + + GfxFillRect(x + clk_dif, y + clk_dif, x + 8 + clk_dif, y + 5 + clk_dif, 0); + GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, cs->legend_colour); + SetDParam(0, cs->name); + DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0); + y += 8; + } + gd.colors[i] = cs->legend_colour; for (j = 0; j != 20; j++) { - gd.cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 6 + 6, i); + gd.cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 6 + 6, c); } + + i++; } + gd.num_dataset = i; DrawGraph(&gd); @@ -770,14 +772,10 @@ static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) } break; case WE_CLICK: { - switch (e->we.click.widget) { - case 3: case 4: case 5: case 6: - case 7: case 8: case 9: case 10: - case 11: case 12: case 13: case 14: + if (e->we.click.widget >= 3 && e->we.click.widget < (int)w->widget_count) { TOGGLEBIT(_legend_excluded_cargo, e->we.click.widget - 3); ToggleWidgetLoweredState(w, e->we.click.widget); SetWindowDirty(w); - break; } } break; } @@ -786,24 +784,12 @@ static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) static const Widget _cargo_payment_rates_widgets[] = { { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, { WWT_CAPTION, RESIZE_NONE, 14, 11, 567, 0, 13, STR_7061_CARGO_PAYMENT_RATES, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PANEL, RESIZE_NONE, 14, 0, 567, 14, 141, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 24, 31, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 32, 39, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 40, 47, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 48, 55, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 56, 63, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 64, 71, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 72, 79, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 80, 87, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 88, 95, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 96, 103, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 104, 111, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 112, 119, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_BOTTOM, 14, 0, 567, 14, 45, 0x0, STR_NULL}, { WIDGETS_END}, }; static const WindowDesc _cargo_payment_rates_desc = { - WDP_AUTO, WDP_AUTO, 568, 142, + WDP_AUTO, WDP_AUTO, 568, 46, WC_PAYMENT_RATES, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, _cargo_payment_rates_widgets, @@ -813,7 +799,39 @@ static const WindowDesc _cargo_payment_rates_desc = { void ShowCargoPaymentRates(void) { - AllocateWindowDescFront(&_cargo_payment_rates_desc, 0); + Window *w = AllocateWindowDescFront(&_cargo_payment_rates_desc, 0); + if (w == NULL) return; + + /* Count the number of active cargo types */ + uint num_active = 0; + for (CargoID c = 0; c != NUM_CARGO; c++) { + if (GetCargo(c)->IsValid()) num_active++; + } + + /* Resize the window to fit the cargo types */ + ResizeWindow(w, 0, num_active * 8); + + /* Add widgets for each cargo type */ + w->widget_count = 3 + num_active; + w->widget = ReallocT(w->widget, w->widget_count); + + /* Set the properties of each widget */ + for (uint i = 0; i != num_active; i++) { + Widget *wi = &w->widget[3 + i]; + wi->type = WWT_PANEL; + wi->display_flags = RESIZE_NONE; + wi->color = 12; + wi->left = 493; + wi->right = 562; + wi->top = 24 + i * 8; + wi->bottom = wi->top + 7; + wi->data = 0; + wi->tooltips = STR_7064_TOGGLE_GRAPH_FOR_CARGO; + + if (!HASBIT(_legend_excluded_cargo, i)) LowerWindowWidget(w, i + 3); + } + + SetWindowDirty(w); } /************************/ |