changeset 13952:315bfb533af0 draft

(svn r18488) -Codechange: Make number of rows for displaying industries in smallmap legend dynamic.
author alberth <alberth@openttd.org>
date Sun, 13 Dec 2009 20:27:53 +0000
parents 443ff91fea9a
children 5291153ee110
files src/smallmap_gui.cpp
diffstat 1 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/smallmap_gui.cpp
+++ b/src/smallmap_gui.cpp
@@ -514,7 +514,6 @@
 	uint min_number_of_columns;    ///< Minimal number of columns in  legends.
 	uint min_number_of_fixed_rows; ///< Minimal number of rows in the legends for the fixed layouts only (all except #SMT_INDUSTRY).
 	uint column_width;             ///< Width of a column in the #SM_WIDGET_LEGEND widget.
-	uint number_of_rows; ///< Number of rows in a column in the #SM_WIDGET_LEGEND widget.
 
 	int32 scroll_x;
 	int32 scroll_y;
@@ -848,6 +847,14 @@
 		this->SmallMapCenterOnCurrentPos();
 	}
 
+	/** Return number of columns that can be displayed in \a width pixels.
+	 * @return Number of columns to display.
+	 */
+	inline uint GetNumberColumnsLegend(uint width) const
+	{
+		return width / this->column_width;
+	}
+
 	virtual void SetStringParameters(int widget) const
 	{
 		switch (widget) {
@@ -897,10 +904,10 @@
 		/* The number of columns may grow beyond the minimally required if the widget is wide enough. */
 		uint columns = max(this->min_number_of_columns, (size->width - WD_FRAMERECT_LEFT) / this->column_width);
 		/* The number of rows is always the minimum, otherwise it depends on the number of industries */
-		this->number_of_rows = max(this->min_number_of_fixed_rows, (_smallmap_industry_count + columns - 1) / columns);
+		uint number_of_rows = max(this->min_number_of_fixed_rows, (_smallmap_industry_count + columns - 1) / columns);
 
 		size->width  = max(columns * this->column_width + WD_FRAMERECT_LEFT, size->width);
-		size->height = max(this->number_of_rows * FONT_HEIGHT_SMALL + WD_FRAMERECT_TOP + 1 + WD_FRAMERECT_BOTTOM, size->height);
+		size->height = max(number_of_rows * FONT_HEIGHT_SMALL + WD_FRAMERECT_TOP + 1 + WD_FRAMERECT_BOTTOM, size->height);
 	}
 
 	virtual void DrawWidget(const Rect &r, int widget) const
@@ -913,11 +920,13 @@
 			} break;
 
 			case SM_WIDGET_LEGEND: {
+				uint columns = this->GetNumberColumnsLegend(r.right - r.left + 1);
+				uint number_of_rows = max(this->map_type == SMT_INDUSTRY ? (_smallmap_industry_count + columns - 1) / columns : 0, this->min_number_of_fixed_rows);
 				bool rtl = _dynlang.text_dir == TD_RTL;
 				uint y_org = r.top + WD_FRAMERECT_TOP;
 				uint x = rtl ? r.right - this->column_width - WD_FRAMERECT_RIGHT : r.left + WD_FRAMERECT_LEFT;
 				uint y = y_org;
-				uint i = 0;
+				uint i = 0; // Row counter for industry legend.
 				uint row_height = FONT_HEIGHT_SMALL;
 
 				uint text_left  = rtl ? 0 : LEGEND_BLOB_WIDTH + WD_FRAMERECT_LEFT;
@@ -926,16 +935,16 @@
 				uint blob_right = rtl ? this->column_width - 1 : LEGEND_BLOB_WIDTH;
 
 				for (const LegendAndColour *tbl = _legend_table[this->map_type]; !tbl->end; ++tbl) {
-					if (tbl->col_break || i++ >= this->number_of_rows) {
+					if (tbl->col_break || (this->map_type == SMT_INDUSTRY && i++ >= number_of_rows)) {
 						/* Column break needed, continue at top, COLUMN_WIDTH pixels
 						 * (one "row") to the right. */
 						x += rtl ? -(int)this->column_width : this->column_width;
 						y = y_org;
-						i = 0;
+						i = 1;
 					}
 
 					if (this->map_type == SMT_INDUSTRY) {
-						/* Industry name must be formated, since it's not in tiny font in the specs.
+						/* Industry name must be formatted, since it's not in tiny font in the specs.
 						 * So, draw with a parameter and use the STR_SMALLMAP_INDUSTRY string, which is tiny font */
 						SetDParam(0, tbl->legend);
 						assert(tbl->type < NUM_INDUSTRYTYPES);
@@ -1026,7 +1035,9 @@
 					/* If click on industries label, find right industry type and enable/disable it */
 					const NWidgetBase *wi = this->GetWidget<NWidgetBase>(SM_WIDGET_LEGEND); // Label panel
 					uint line = (pt.y - wi->pos_y - WD_FRAMERECT_TOP) / FONT_HEIGHT_SMALL;
-					if (line >= this->number_of_rows) break;
+					uint columns = this->GetNumberColumnsLegend(wi->current_x);
+					uint number_of_rows = max((_smallmap_industry_count + columns - 1) / columns, this->min_number_of_fixed_rows);
+					if (line >= number_of_rows) break;
 
 					bool rtl = _dynlang.text_dir == TD_RTL;
 					int x = pt.x - wi->pos_x;
@@ -1034,7 +1045,7 @@
 					uint column = (x - WD_FRAMERECT_LEFT) / this->column_width;
 
 					/* Check if click is on industry label*/
-					int industry_pos = (column * this->number_of_rows) + line;
+					int industry_pos = (column * number_of_rows) + line;
 					if (industry_pos < _smallmap_industry_count) {
 						_legend_from_industries[industry_pos].show_on_map = !_legend_from_industries[industry_pos].show_on_map;
 					}