diff src/graph_gui.cpp @ 13734:f41a11f073f6 draft

(svn r18259) -Codechange: make the graphs big font aware
author rubidium <rubidium@openttd.org>
date Mon, 23 Nov 2009 19:53:58 +0000 (2009-11-23)
parents a1342a520bb0
children 49a2ea927978
line wrap: on
line diff
--- a/src/graph_gui.cpp
+++ b/src/graph_gui.cpp
@@ -255,7 +255,7 @@
 	 * Actually draw the graph.
 	 * @param r the rectangle of the data field of the graph
 	 */
-	void DrawGraph(Rect &r) const
+	void DrawGraph(Rect r) const
 	{
 		uint x, y;                       ///< Reused whenever x and y coordinates are needed.
 		OverflowSafeInt64 highest_value; ///< Highest value to be drawn.
@@ -454,25 +454,59 @@
 
 	void InitializeWindow(const WindowDesc *desc, WindowNumber number)
 	{
-		this->InitNested(desc, number);
-
 		/* Initialise the dataset */
 		this->UpdateStatistics(true);
+
+		this->InitNested(desc, number);
 	}
 
 public:
 	virtual void OnPaint()
 	{
 		this->DrawWidgets();
+	}
 
-		NWidgetBase *nwid = this->GetWidget<NWidgetBase>(this->graph_widget);
-		Rect r;
-		r.left = nwid->pos_x;
-		r.right = nwid->pos_x + nwid->current_x - 1;
-		r.top = nwid->pos_y;
-		r.bottom = nwid->pos_y + nwid->current_y - 1;
+	virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
+	{
+		if (widget != this->graph_widget) return;
+
+		uint x_label_width = 0;
+
+		if (this->month != 0xFF) {
+			byte month = this->month;
+			Year year  = this->year;
+			for (int i = 0; i < this->num_on_x_axis; i++) {
+				SetDParam(0, month + STR_MONTH_ABBREV_JAN);
+				SetDParam(1, month + STR_MONTH_ABBREV_JAN + 2);
+				SetDParam(2, year);
+				x_label_width = max(x_label_width, GetStringBoundingBox(month == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH).width);
 
-		this->DrawGraph(r);
+				month += 3;
+				if (month >= 12) {
+					month = 0;
+					year++;
+				}
+			}
+		} else {
+			/* Draw the label under the data point rather than on the grid line. */
+			SetDParam(0, this->x_values_start + this->num_on_x_axis * this->x_values_increment);
+			x_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL_NUMBER).width;
+		}
+
+		SetDParam(0, this->format_str_y_axis);
+		SetDParam(1, INT64_MAX);
+		uint y_label_width = GetStringBoundingBox(STR_GRAPH_Y_LABEL).width;
+
+		size->width  = max<uint>(size->width,  5 + y_label_width + this->num_on_x_axis * (x_label_width + 5) + 9);
+		size->height = max<uint>(size->height, 5 + (1 + GRAPH_NUM_LINES_Y * 2 + (this->month != 0xFF ? 3 : 1)) * FONT_HEIGHT_SMALL + 4);
+		size->height = max<uint>(size->height, size->width / 3);
+	}
+
+	virtual void DrawWidget(const Rect &r, int widget) const
+	{
+		if (widget != this->graph_widget) return;
+
+		DrawGraph(r);
 	}
 
 	virtual OverflowSafeInt64 GetGraphData(const Company *c, int j)
@@ -788,7 +822,10 @@
 
 	virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
 	{
-		if (widget < CPW_CARGO_FIRST) return;
+		if (widget < CPW_CARGO_FIRST) {
+			BaseGraphWindow::UpdateWidgetSize(widget, size, padding, fill, resize);
+			return;
+		}
 
 		const CargoSpec *cs = CargoSpec::Get(widget - CPW_CARGO_FIRST);
 		SetDParam(0, cs->name);
@@ -801,7 +838,10 @@
 
 	virtual void DrawWidget(const Rect &r, int widget) const
 	{
-		if (widget < CPW_CARGO_FIRST) return;
+		if (widget < CPW_CARGO_FIRST) {
+			BaseGraphWindow::DrawWidget(r, widget);
+			return;
+		}
 
 		const CargoSpec *cs = CargoSpec::Get(widget - CPW_CARGO_FIRST);
 		bool rtl = _dynlang.text_dir == TD_RTL;