(svn r13339) -Feature: splitting of the main toolbar when the resolution becomes very low so the buttons are still visible and useable. Patch by Dominik.
authorrubidium
Thu, 29 May 2008 23:33:37 +0000
changeset 9425 fe15794c1448
parent 9424 0e77ca5edffb
child 9426 a77c8a4abcf5
(svn r13339) -Feature: splitting of the main toolbar when the resolution becomes very low so the buttons are still visible and useable. Patch by Dominik.
bin/data/openttdd.grf
bin/data/openttdw.grf
src/table/files.h
src/table/sprites.h
src/toolbar_gui.cpp
Binary file bin/data/openttdd.grf has changed
Binary file bin/data/openttdw.grf has changed
--- a/src/table/files.h	Thu May 29 22:22:02 2008 +0000
+++ b/src/table/files.h	Thu May 29 23:33:37 2008 +0000
@@ -35,7 +35,7 @@
 		{ "TRGT.GRF",      {0xfc, 0xde, 0x1d, 0x7e, 0x8a, 0x74, 0x19, 0x7d, 0x72, 0xa6, 0x26, 0x95, 0x88, 0x4b, 0x90, 0x9e} }
 	},
 	{ "SAMPLE.CAT",    {0x42, 0x2e, 0xa3, 0xdd, 0x07, 0x4d, 0x28, 0x59, 0xbb, 0x51, 0x63, 0x9a, 0x6e, 0x0e, 0x85, 0xda} },
-	{ "OPENTTDD.GRF",  {0xb2, 0xbd, 0xd2, 0xa4, 0x1b, 0xfa, 0x2c, 0x60, 0x4f, 0xd5, 0x5e, 0x4c, 0xb5, 0xba, 0x37, 0x73} }
+	{ "OPENTTDD.GRF",  {0xb6, 0xed, 0x9a, 0x20, 0x89, 0xad, 0x6e, 0xa1, 0x55, 0x10, 0xad, 0x00, 0x53, 0xa3, 0xd5, 0xbc} }
 };
 
 
@@ -49,5 +49,5 @@
 		{ "TRGTR.GRF",     {0xde, 0x53, 0x65, 0x05, 0x17, 0xfe, 0x66, 0x1c, 0xea, 0xa3, 0x13, 0x8c, 0x6e, 0xdb, 0x0e, 0xb8} }
 	},
 	{ "SAMPLE.CAT",    {0x92, 0x12, 0xe8, 0x1e, 0x72, 0xba, 0xdd, 0x4b, 0xbe, 0x1e, 0xae, 0xae, 0x66, 0x45, 0x8e, 0x10} },
-	{ "OPENTTDW.GRF",  {0x3b, 0x1a, 0x0d, 0x8c, 0x2d, 0x01, 0x0e, 0xee, 0x47, 0x7f, 0x5d, 0x70, 0x8f, 0xb2, 0xe4, 0xfb} }
+	{ "OPENTTDW.GRF",  {0x41, 0x1e, 0xb6, 0xb2, 0xd2, 0xc4, 0x30, 0x6e, 0x7b, 0xc7, 0xdc, 0x39, 0xd4, 0x40, 0x46, 0xfb} }
 };
--- a/src/table/sprites.h	Thu May 29 22:22:02 2008 +0000
+++ b/src/table/sprites.h	Thu May 29 23:33:37 2008 +0000
@@ -49,7 +49,7 @@
 
 	/* Extra graphic spritenumbers */
 	SPR_OPENTTD_BASE     = 4896,
-	OPENTTD_SPRITE_COUNT = 144,
+	OPENTTD_SPRITE_COUNT = 145,
 
 	/* Halftile-selection sprites */
 	SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE,
@@ -122,6 +122,8 @@
 	SPR_GROUP_REPLACE_OFF_SHIP     = SPR_OPENTTD_BASE + 132,
 	SPR_GROUP_REPLACE_OFF_AIRCRAFT = SPR_OPENTTD_BASE + 133,
 
+	SPR_SWITCH_TOOLBAR = SPR_OPENTTD_BASE + 144,
+
 	SPR_SIGNALS_BASE  = SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT,
 	PRESIGNAL_SPRITE_COUNT                   =  48,
 	PRESIGNAL_AND_SEMAPHORE_SPRITE_COUNT     = 112,
--- a/src/toolbar_gui.cpp	Thu May 29 22:22:02 2008 +0000
+++ b/src/toolbar_gui.cpp	Thu May 29 23:33:37 2008 +0000
@@ -47,10 +47,19 @@
 
 static void PopupMainToolbMenu(Window *parent, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask = 0, int sel_index = 0, int checked_items = 0);
 static void PopupMainPlayerToolbMenu(Window *parent, int main_button, int gray);
+static void SplitToolbar(Window *w);
 
 RailType _last_built_railtype;
 RoadType _last_built_roadtype;
 
+enum ToolbarMode {
+	TB_NORMAL,
+	TB_UPPER,
+	TB_LOWER
+};
+
+static ToolbarMode _toolbar_mode;
+
 static void SelectSignTool()
 {
 	if (_cursor.sprite == SPR_CURSOR_SIGN) {
@@ -282,7 +291,7 @@
 
 static void ToolbarGraphsClick(Window *w)
 {
-	PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, 6);
+	PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, (_toolbar_mode == TB_NORMAL) ? 6 : 8);
 }
 
 static void MenuClickGraphs(int index)
@@ -294,6 +303,9 @@
 		case 3: ShowPerformanceHistoryGraph(); break;
 		case 4: ShowCompanyValueGraph();       break;
 		case 5: ShowCargoPaymentRates();       break;
+		/* functions for combined graphs/league button */
+		case 6: ShowCompanyLeagueTable();      break;
+		case 7: ShowPerformanceRatingDetail(); break;
 	}
 }
 
@@ -533,6 +545,22 @@
 	}
 }
 
+/* --- Switch toolbar button --- */
+
+static void ToolbarSwitchClick(Window *w)
+{
+	if (_toolbar_mode != TB_LOWER) {
+		_toolbar_mode = TB_LOWER;
+	} else {
+		_toolbar_mode = TB_UPPER;
+	}
+
+	SplitToolbar(w);
+	w->HandleButtonClick(27);
+	SetWindowDirty(w);
+	SndPlayFx(SND_15_BEEP);
+}
+
 /* --- Scenario editor specific handlers. */
 
 static void ToolbarScenDateBackward(Window *w)
@@ -631,6 +659,90 @@
 {
 }
 
+/* --- Resizing the toolbar */
+
+static void ResizeToolbar(Window *w)
+{
+	/* There are 27 buttons plus some spacings if the space allows it */
+	uint button_width;
+	uint spacing;
+	if (w->width >= 27 * 22) {
+		button_width = 22;
+		spacing = w->width - (27 * button_width);
+	} else {
+		button_width = w->width / 27;
+		spacing = 0;
+	}
+	uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
+
+	for (uint i = 0, x = 0, j = 0; i < 27; i++) {
+		if (extra_spacing_at[j] == i) {
+			j++;
+			uint add = spacing / (lengthof(extra_spacing_at) - j);
+			spacing -= add;
+			x += add;
+		}
+
+		w->widget[i].type = WWT_IMGBTN;
+		w->widget[i].left = x;
+		x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
+		w->widget[i].right = x - 1;
+	}
+
+	w->widget[27].type = WWT_EMPTY;
+	_toolbar_mode = TB_NORMAL;
+}
+
+/* --- Split the toolbar */
+
+static void SplitToolbar(Window *w)
+{
+	static const byte arrange14[] = {
+		0,  1, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 27,
+		2,  3,  4,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 27,
+	};
+	static const byte arrange15[] = {
+		0,  1,  4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
+		0,  2,  4,  3,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 27,
+	};
+	static const byte arrange16[] = {
+		0,  1,  2,  4, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
+		0,  1,  3,  5,  6,  7,  8,  9, 10, 12, 24, 25, 26, 17, 18, 27,
+	};
+	static const byte arrange17[] = {
+		0,  1,  2,  4,  6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 17, 18, 27,
+		0,  1,  3,  4,  6,  5,  7,  8,  9, 10, 12, 24, 25, 26, 17, 18, 27,
+	};
+	static const byte arrange18[] = {
+		0,  1,  2,  4,  5,  6,  7,  8,  9, 12, 19, 20, 21, 22, 23, 17, 18, 27,
+		0,  1,  3,  4,  5,  6,  7, 10, 13, 14, 15, 16, 24, 25, 26, 17, 18, 27,
+	};
+	static const byte arrange19[] = {
+		0,  1,  2,  4,  5,  6, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 17, 18, 27,
+		0,  1,  3,  4,  7,  8,  9, 10, 12, 25, 19, 20, 21, 22, 23, 26, 17, 18, 27,
+	};
+
+	static const byte *arrangements[] = { arrange14, arrange15, arrange16, arrange17, arrange18, arrange19 };
+
+	static const uint icon_size = 22;
+	uint max_icons = max(14U, (w->width + icon_size / 2) / icon_size);
+
+	assert(max_icons >= 14 && max_icons <= 19);
+
+	/* first hide all icons */
+	for (uint i = 0; i < 27; i++) {
+		w->widget[i].type = WWT_EMPTY;
+	}
+
+	/* now activate them all on their proper positions */
+	for (uint i = 0, x = 0, n = max_icons - 14; i < max_icons; i++) {
+		uint icon = arrangements[n][i + ((_toolbar_mode == TB_LOWER) ? max_icons : 0)];
+		w->widget[icon].type = WWT_IMGBTN;
+		w->widget[icon].left = x;
+		x += (w->width - x) / (max_icons - i);
+		w->widget[icon].right = x - 1;
+	}
+}
 
 /* --- Toolbar handling for the 'normal' case */
 
@@ -664,6 +776,7 @@
 	ToolbarMusicClick,
 	ToolbarNewspaperClick,
 	ToolbarHelpClick,
+	ToolbarSwitchClick,
 };
 
 struct MainToolbarWindow : Window {
@@ -774,29 +887,10 @@
 
 	virtual void OnResize(Point new_size, Point delta)
 	{
-		/* There are 27 buttons plus some spacings if the space allows it */
-		uint button_width;
-		uint spacing;
-		if (this->width >= 27 * 22) {
-			button_width = 22;
-			spacing = this->width - (27 * button_width);
+		if (this->width <= 19 * 22) {
+			SplitToolbar(this);
 		} else {
-			button_width = this->width / 27;
-			spacing = 0;
-		}
-		uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
-
-		for (uint i = 0, x = 0, j = 0; i < 27; i++) {
-			if (extra_spacing_at[j] == i) {
-				j++;
-				uint add = spacing / (lengthof(extra_spacing_at) - j);
-				spacing -= add;
-				x += add;
-			}
-
-			this->widget[i].left = x;
-			x += (spacing != 0) ? button_width : (this->width - x) / (27 - i);
-			this->widget[i].right = x - 1;
+			ResizeToolbar(this);
 		}
 	}
 
@@ -850,6 +944,7 @@
 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MUSIC,           STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_MESSAGES,        STR_0203_SHOW_LAST_MESSAGE_NEWS},
 {     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_IMG_QUERY,           STR_0186_LAND_BLOCK_INFORMATION},
+{     WWT_IMGBTN,   RESIZE_NONE,    14,     0,     0,     0,    21, SPR_SWITCH_TOOLBAR,      STR_EMPTY}, // switch toolbar button. only active when toolbar has been split
 {   WIDGETS_END},
 };